首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpringDataJPA2.0.9发行版的多个DataBase配置

SpringDataJPA2.0.9发行版的多个DataBase配置
EN

Stack Overflow用户
提问于 2019-11-07 11:35:37
回答 1查看 262关注 0票数 0

我有两个JPA配置类。我需要配置两个数据库(Oracle连接)。当我连接JDBC模板时,它通过使用@PersistenceContext完美地工作。在使用JPA时,它最初是默认的,但在执行之前,它使用了第二个,然后执行查询。我对此感到非常困惑。有人能消除我的疑虑吗?

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

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

代码语言:javascript
复制
@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,

代码语言:javascript
复制
@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());
    }

}

我的方法电话,

代码语言:javascript
复制
 @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;
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-08 07:03:35

我通过改变基本路线解决了我的问题。效果很好。

我的二等课,

代码语言:javascript
复制
@ConditionalOnProperty(name = "embedded", havingValue = "true", matchIfMissing = true)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "dataSyncEntityManagerFactory", transactionManagerRef = "dataSyncTransactionManager", basePackages = {
        "kgfsl.rms.datasync" })
public class JPADataSyncConfig {
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58747937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档