首页 > 解决方案 > Spring Data JPA 2.0.9 版本的多数据库配置

问题描述

我有两个 JPA 配置类。我需要配置两个数据库(Oracle 连接)。当我使用 JDBC 模板连接时,它可以通过使用 @PersistenceContext 完美运行。在使用 JPA Repo 时,它最初采用默认值,但在执行之前,它需要第二次并执行查询。我对此感到非常困惑。有人能解开我的疑惑吗?

Spring Boot- 2.0.9 Spring-data-jpa - 2.0.9 Hibernate - 5.2.18

我的第一堂课(默认)- JPAConfig.java ,

@ConditionalOnProperty(name = "embedded", havingValue = "true", matchIfMissing = true)
@Configuration
@RefreshScope
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory", transactionManagerRef = "transactionManager", basePackages = {
        "kgfsl" })
public class JPAConfig {

    @Bean
    public Validator getValidator() {
        return new LocalValidatorFactoryBean();
    }

    @Value("${db.url}")
    String dbUrl = "jdbc:oracle:thin:@10.100.1.95:1539:HFSL12C";

    @Value("${db.driverClassName}")
    String dbDriverClassName = "oracle.jdbc.driver.OracleDriver";

    @Value("${db.userName}")
    String dbUserName = "TENYV2";

    @Value("${db.password}")
    String dbPassword = "TENYV2";

    @Value("${db.databaseType}")
    String dbDatabaseType = "Oracle";

    @Value("${encryptionOn:false}")
    private boolean encryptionOn;



    @Bean
    @Primary
    @RefreshScope
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(dbDriverClassName);
        dataSource.setSchema(dbUserName);
        dataSource.setUrl(dbUrl);
        dataSource.setUsername(dbUserName);
        if (encryptionOn)
            dataSource.setPassword(CryptoUtil.decrypt(dbPassword));
        else
            dataSource.setPassword(dbPassword);
        return dataSource;
    }

    @Bean
    @Primary
    @RefreshScope
    public Map<String, Object> jpaProperties() {
        Map<String, Object> props = new HashMap<>();
        props.put("hibernate.dialect", ApplicationStartUpFactory.getDialect(dbDatabaseType));       
        props.put("javax.persistence.validation.mode", "none");
        props.put("hibernate.id.new_generator_mappings", "false");  
        props.put("hibernate.default_schema", dbUserName);          
        return props;
    }   


    public static int batchSize() {
        return Integer.valueOf(Dialect.DEFAULT_BATCH_SIZE);
    }

    @Primary
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
        hibernateJpaVendorAdapter.setShowSql(true);
        hibernateJpaVendorAdapter.setGenerateDdl(false);
        hibernateJpaVendorAdapter.setDatabase(ApplicationStartUpFactory.getJPAVendor(dbDatabaseType));
        hibernateJpaVendorAdapter.setDatabasePlatform(dbUserName);
        return hibernateJpaVendorAdapter;
    }

    @Primary
    @Bean
    public PlatformTransactionManager transactionManager() {
        return new JpaTransactionManager(entityManagerFactory().getObject());
    }

    @Bean()
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
        lef.setDataSource(this.dataSource());
        lef.setJpaPropertyMap(this.jpaProperties());
        lef.setJpaVendorAdapter(this.jpaVendorAdapter());
        String entityPackages = "kgfsl.*.*";
        lef.setPackagesToScan(entityPackages.split(","));
        lef.setPersistenceUnitName("default"); // <- giving 'default' as name

        return lef;
    }

    @Bean()
    @Qualifier("jdbcTemplate")
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(this.dataSource());
    }

    @Bean(name = "namedParameterJdbcTemplate")
    public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
        return new NamedParameterJdbcTemplate(this.dataSource());
    }

    @SuppressWarnings("unused")
    private DatabasePopulator createDatabasePopulator() {
        ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
        databasePopulator.setContinueOnError(false);
        /*
         * if (new ClassPathResource("basic_table.sql").exists())
         * databasePopulator.addScript(new ClassPathResource("basic_table.sql"));
         */
        return databasePopulator;
    }

    @Bean
    @Primary
    public PhysicalNamingStrategy physical() {
        return new PhysicalNamingStrategyStandardImpl();
    }

    @Bean
    @Primary
    public ImplicitNamingStrategy implicit() {
        return new ImplicitNamingStrategyJpaCompliantImpl();
    }

我的第二类(非默认)- JPADataSyncConfig.java,

@ConditionalOnProperty(name = "embedded", havingValue = "true", matchIfMissing = true)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "dataSyncEntityManagerFactory", transactionManagerRef = "dataSyncTransactionManager", basePackages = {
        "kgfsl" })
public class JPADataSyncConfig {

    @Value("${db.syncurl}")
    String dbUrl = "jdbc:oracle:thin:@10.100.1.94:1522:TENYY";

    @Value("${db.syncurldriverClassName}")
    String dbDriverClassName = "oracle.jdbc.driver.OracleDriver";

    @Value("${db.syncuserName}")
    String dbUserName = "MYNEWDB";

    @Value("${db.syncpassword}")
    String dbPassword = "MYNEWDB";

    @Value("${db.syncurldatabaseType}")
    String dbDatabaseType = "Oracle";

    @Value("${encryptionOn:false}")
    private boolean encryptionOn;

    @Bean(name = "dataSyncDataSource")
    public DataSource dataSyncDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(dbDriverClassName);
        dataSource.setUrl(dbUrl);
        dataSource.setUsername(dbUserName);
        if (encryptionOn)
            dataSource.setPassword(CryptoUtil.decrypt(dbPassword));
        else
            dataSource.setPassword(dbPassword);
        return dataSource;
    }

    @Bean(name = "dataSyncJpaProperties")
    public Map<String, Object> dataSyncJpaProperties() {
        Map<String, Object> props = new HashMap<>();
        props.put("hibernate.dialect", ApplicationStartUpFactory.getDialect(dbDatabaseType));
        props.put("javax.persistence.validation.mode", "none");
        props.put("hibernate.id.new_generator_mappings", "false");
        return props;
    }

    public static int batchSize() {
        return Integer.valueOf(Dialect.DEFAULT_BATCH_SIZE);
    }

    @Bean(name = "dataSyncJpaVendorAdapter")
    public JpaVendorAdapter dataSyncJpaVendorAdapter() {
        HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
        hibernateJpaVendorAdapter.setShowSql(false);
        hibernateJpaVendorAdapter.setGenerateDdl(false);
        hibernateJpaVendorAdapter.setDatabase(ApplicationStartUpFactory.getJPAVendor(dbDatabaseType));
        return hibernateJpaVendorAdapter;
    }

    @Bean(name = "dataSyncTransactionManager")
    public PlatformTransactionManager dataSyncTransactionManager() {
        return new JpaTransactionManager(dataSyncEntityManagerFactory().getObject());
    }

    @Bean(name = "dataSyncEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean dataSyncEntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
        lef.setDataSource(this.dataSyncDataSource());
        lef.setJpaPropertyMap(this.dataSyncJpaProperties());
        lef.setJpaVendorAdapter(this.dataSyncJpaVendorAdapter());
        String entityPackages = "kgfsl.*.*";
        lef.setPackagesToScan(entityPackages.split(","));
        return lef;
    }

    @Bean(name = "dataSyncJdbcTemplate")
    public JdbcTemplate dataSyncJdbcTemplate() {
        return new JdbcTemplate(this.dataSyncDataSource());
    }

}

我的方法调用,

 @Transactional(rollbackFor = Exception.class)
        public List<Customer> listPending(Long formId) throws Exception, JsonParseException, JsonMappingException,
                ClassNotFoundException, JSONException, IOException, ParseException, CustomException {

            List<Customer> auditData = customerRepo.findByFormIdAndStatus(formId, 'P');     

            return auditData;
        }

标签: oraclehibernatespring-bootjpa

解决方案


我通过更改基本路径解决了我的问题。它工作正常。

我的二年级,

@ConditionalOnProperty(name = "embedded", havingValue = "true", matchIfMissing = true)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "dataSyncEntityManagerFactory", transactionManagerRef = "dataSyncTransactionManager", basePackages = {
        "kgfsl.rms.datasync" })
public class JPADataSyncConfig {

推荐阅读