Весенняя загрузка со вторым запросом репозитория объекта JPA выполняется нормально, но не может сохраняться без ошибок

#java #spring-boot #jpa

#java #spring-boot #jpa

Вопрос:

Как говорит титтл, у меня есть два источника данных в моем приложении, и первый репозиторий работает нормально, но мой второй репозиторий не может сохранить обновление или удалить, только запрос работает хорошо. когда я проверяю консоль, ошибка не появляется. Может ли кто-нибудь помочь?

первая конфигурация репозитория

 package com.iisigroup.product.insightplatform.config;

import com.iisigroup.product.insightplatform.repository.jpa.CustomMsgRutLogsRepository;
import com.iisigroup.product.insightplatform.repository.jpa.impl.BaseRepositoryImpl;
import com.iisigroup.product.insightplatform.repository.jpa.impl.MsgRutLogsGeneralRepositoryImpl;
import com.iisigroup.product.insightplatform.repository.jpa.impl.MsgRutLogsOracleRepositoryImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.iisigroup.product.insightplatform.repository.jpa"
        , repositoryBaseClass = BaseRepositoryImpl.class,
        transactionManagerRef = "JPATra", entityManagerFactoryRef = "entityManagerFactory1")
public class JPAConfig {
    @Autowired
    private DataSource dataSource;

    @Autowired
    private Environment env;

    @Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource);
    }

    @Primary
    @Bean(name = "JPATra")
    public PlatformTransactionManager transactionManager1() {
        final JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory1());
        return txManager;
    }


    @Bean(name = "entityManagerFactory1")
    @Primary
    public EntityManagerFactory entityManagerFactory1() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();

        em.setDataSource(dataSource);
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaProperties(hibernateProperties());
        em.setJpaVendorAdapter(vendorAdapter);
        em.setPackagesToScan(new String[]{"com.iisigroup.product.insightplatform.domain.jpa"});
        em.setPersistenceUnitName("emfBW");
        em.afterPropertiesSet();
        return em.getObject();
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.show_sql", "false");
        properties.setProperty("hibernate.max_fetch_depth", "3");
        properties.setProperty("hibernate.jdbc.fetch_size", "50");
        properties.setProperty("hibernate.jdbc.batch_size",
                env.getProperty("spring.jpa.properties.hibernate.jdbc.batch_size"));
        properties.setProperty("hibernate.enable_lazy_load_no_trans", "true");
        return properties;
    }


}

  

второй репозиторий

 package com.iisigroup.product.insightplatform.config;

import com.iisigroup.product.insightplatform.repository.traffic.BaseRepositoryImpl;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.iisigroup.product.insightplatform.repository.traffic",
        repositoryBaseClass = BaseRepositoryImpl.class,
        entityManagerFactoryRef = "trafficentityManagerFactory",
        transactionManagerRef = "traffictransactionManager")
public class TrafficJPAConfig {
    @Autowired
    private Environment env;

    @Bean(name = "trafficDatasource")
    public HikariDataSource trafficDatasource() {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl("secondUrl");
        dataSource.setUsername("secondUser");
        dataSource.setPassword("secondPass");
        dataSource.setMaximumPoolSize(8);
        dataSource.setIdleTimeout(15);
        dataSource.setConnectionTimeout(3000);
        return dataSource;
    }

    @Bean
    public JdbcTemplate trafficjdbcTemplate() {
        return new JdbcTemplate(trafficDatasource());
    }
    @PersistenceContext(unitName="traffic")
    @Bean(name = "traffictransactionManager")
    public PlatformTransactionManager traffictransactionManager() {
        final  JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(productEntityManager().getObject());
        return txManager;
    }

    @PersistenceContext(unitName="traffic")
    @Bean(name = "trafficentityManagerFactory")
    public EntityManagerFactory trafficentityManagerFactory() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(trafficDatasource());
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaProperties(hibernateProperties());
        em.setJpaVendorAdapter(vendorAdapter);
        em.setPackagesToScan(new String[]{"com.iisigroup.product.insightplatform.repository.traffic","com.iisigroup.product.insightplatform.domain.jpa"});
        em.setPersistenceUnitName("traffic");
        em.afterPropertiesSet();
        return em.getObject();
    }
    @Bean
    @PersistenceContext(unitName="traffic")
    public LocalContainerEntityManagerFactoryBean productEntityManager() {
        final LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(trafficDatasource());
        em.setPackagesToScan(
                new String[] {"com.iisigroup.product.insightplatform.repository.traffic","com.iisigroup.product.insightplatform.domain.jpa"});
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(hibernateProperties());

        return em;
    }
    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.max_fetch_depth", "3");
        properties.setProperty("hibernate.jdbc.fetch_size", "50");
        properties.setProperty("hibernate.jdbc.batch_size",
                env.getProperty("spring.jpa.properties.hibernate.jdbc.batch_size"));
        properties.setProperty("hibernate.enable_lazy_load_no_trans", "true");
        return properties;
    }


}

  

И я пытаюсь переопределить метод удаления с помощью under code, он отлично работает

     @Override
    public void delete(String s) {
        TrafficJPAConfig cc = new TrafficJPAConfig();
        JdbcTemplate temp = cc.trafficjdbcTemplate();
        String sql = String.format("delete from UserColumnGrpFieldValueSTB where UUID ='%s' ", s);
        temp.execute(sql);

//        super.delete(s);
    }
  

Комментарии:

1. Первое, что я подозреваю, это то, что вы проверили, что ваш второй источник данных в изолированной среде (без первого источника данных) может выполнять операции сохранения, удаления? Если ваши сущности находятся в двунаправленных отношениях, обязательно синхронизируйте их перед удалением.

Ответ №1:

после использования второго источника данных в изолированной среде это не имело никакого значения. Но это работает после того, как я изменил свою вторую конфигурацию источника данных, как мой приведенный ниже код, он работает нормально. Я не знаю причину, по которой это работает, и мне любопытно, кто-нибудь знает почему?

 @Configuration
//@ComponentScan("com.iisigroup.product.insightplatform.domain.jpa")
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.iisigroup.product.insightplatform.repository.traffic",
        repositoryBaseClass = BaseRepositoryImpl.class,
        entityManagerFactoryRef = "trafficentityManagerFactory",
        transactionManagerRef = "traffictransactionManager")
public class TrafficJPAConfig {
    @Autowired
    private Environment env;

    @Bean(name = "trafficDatasource")
    public HikariDataSource trafficDatasource() {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl("secondDatasouce");
        dataSource.setUsername("secondDatasouce");
        dataSource.setPassword("secondDatasouce");
        dataSource.setMaximumPoolSize(8);
        dataSource.setIdleTimeout(15);
        dataSource.setConnectionTimeout(3000);
        return dataSource;
    }

    @Bean
    public JdbcTemplate trafficjdbcTemplate() {
        return new JdbcTemplate(trafficDatasource());
    }
    @PersistenceContext(unitName="traffic")
    @Bean(name = "traffictransactionManager")
    public PlatformTransactionManager traffictransactionManager() {
        final  JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(trafficentityManagerFactory());
        return txManager;
    }

    @PersistenceContext(unitName="traffic")
    @Bean(name = "trafficentityManagerFactory")
    public EntityManagerFactory trafficentityManagerFactory() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(trafficDatasource());
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaProperties(hibernateProperties());
        em.setJpaVendorAdapter(vendorAdapter);
//         em.setEntityManagerFactoryInterface(MultiEntityManagerFactory.class);
        em.setPackagesToScan(new String[]{"com.iisigroup.product.insightplatform.repository.traffic","com.iisigroup.product.insightplatform.domain.jpa"});
        em.setPersistenceUnitName("traffic");
        em.afterPropertiesSet();
        return em.getObject();
    }
//    @Bean
//    @PersistenceContext(unitName="traffic")
//    public LocalContainerEntityManagerFactoryBean productEntityManager() {
//        final LocalContainerEntityManagerFactoryBean em
//                = new LocalContainerEntityManagerFactoryBean();
//        em.setDataSource(trafficDatasource());
//        em.setPackagesToScan(
//                new String[] {"com.iisigroup.product.insightplatform.repository.traffic","com.iisigroup.product.insightplatform.domain.jpa"});
//        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
////        final HashMap<String, Object> properties = new HashMap<String, Object>();
////        properties.put("hibernate.hbm2ddl.auto", "auto");
////        properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
////        em.setJpaPropertyMap(properties);
//        em.setJpaVendorAdapter(vendorAdapter);
//        em.setJpaProperties(hibernateProperties());
//
//        return em;
//    }
    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.max_fetch_depth", "3");
        properties.setProperty("hibernate.jdbc.fetch_size", "50");
        properties.setProperty("hibernate.jdbc.batch_size",
                env.getProperty("spring.jpa.properties.hibernate.jdbc.batch_size"));
        properties.setProperty("hibernate.enable_lazy_load_no_trans", "true");
        return properties;
    }


}