У меня есть два класса конфигурации JPA. Мне нужно настроить две базы данных (Oracle Connections). Хотя я соединяюсь с шаблоном 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;
}