2
4 개의 JPA 엔티티 관리자를 사용하여 스프링 부트 응용 프로그램으로 4 개의 MySQL 데이터 소스를 설정하려고합니다. 나는 봄과 봄에 신물이 나. 나는 단서를 얻기 위해 이것을 봤지만 결과는 매우 혼란 스러웠다. 설정 방법이 많았지 만 (멀티 데이터 소스를 다루는 것이 아니라), 나는 무엇을 따라야할지 모른다. 결국 각 MySQL 데이터 소스에 대해 네 개의 별도 엔티티 관리자를 설정하고 트랜잭션에서 별도로 사용하려고합니다.@Qualifier가 스프링 부트의 다중 DataSource 빈과 함께 작동하지 않습니다.
application.properties
# Database Properties
db.driver: com.mysql.jdbc.Driver
db.urlHotelPos: jdbc:mysql://localhost:3306/hotelwebpos
db.urlHotelFinance: jdbc:mysql://localhost:3306/hotelfinance
db.urlHotelInventory: jdbc:mysql://localhost:3306/hotelinventory
db.urlReservation: jdbc:mysql://localhost:3306/reservation
db.username: user
db.password: passwd
# Hibernate Properties
hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql: true
hibernate.hbm2ddl.auto: update
entitymanager.packagesToScan: com.test.poswebservice.model.*
DBconfigs.java
@Configuration
@EnableTransactionManagement
public class DBconfigs {
@Bean
public DataSource dataSourceHotelPos() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.urlHotelPos"));
dataSource.setUsername(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
return dataSource;
}
@Bean
public DataSource dataSourceHotelFinance() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.urlHotelFinance"));
dataSource.setUsername(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
return dataSource;
}
@Bean
public DataSource dataSourceHotelInventory() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.urlHotelInventory"));
dataSource.setUsername(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
return dataSource;
}
@Bean
public DataSource dataSourceReservation() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.urlReservation"));
dataSource.setUsername(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
return dataSource;
}
@Bean
@Qualifier("dataSourceHotelPos")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryHotelPos() {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSourceHotelPos());
entityManagerFactory.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactory.setJpaVendorAdapter(vendorAdapter);
Properties additionalProperties = new Properties();
additionalProperties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
additionalProperties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
additionalProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
entityManagerFactory.setJpaProperties(additionalProperties);
return entityManagerFactory;
}
@Bean
@Qualifier("dataSourceHotelFinance")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryHotelFinance() {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSourceHotelFinance());
entityManagerFactory.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactory.setJpaVendorAdapter(vendorAdapter);
Properties additionalProperties = new Properties();
additionalProperties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
additionalProperties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
additionalProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
entityManagerFactory.setJpaProperties(additionalProperties);
return entityManagerFactory;
}
@Bean
@Qualifier("dataSourceHotelInventory")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryHotelInventory(){
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSourceHotelInventory());
entityManagerFactory.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactory.setJpaVendorAdapter(vendorAdapter);
Properties additionalProperties = new Properties();
additionalProperties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
additionalProperties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
additionalProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
entityManagerFactory.setJpaProperties(additionalProperties);
return entityManagerFactory;
}
@Bean
@Qualifier("dataSourceReservation")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryReservation() {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSourceReservation());
entityManagerFactory.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactory.setJpaVendorAdapter(vendorAdapter);
Properties additionalProperties = new Properties();
additionalProperties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
additionalProperties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
additionalProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
entityManagerFactory.setJpaProperties(additionalProperties);
return entityManagerFactory;
}
@Bean
@Qualifier("entityManagerFactoryHotelPos")
public JpaTransactionManager transactionManagerHotelPos() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactoryHotelPos().getObject());
return transactionManager;
}
@Bean
@Qualifier("entityManagerFactoryHotelFinance")
public JpaTransactionManager transactionManagerHotelFinance() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactoryHotelFinance().getObject());
return transactionManager;
}
@Bean
@Qualifier("entityManagerFactoryHotelInventory")
public JpaTransactionManager transactionManagerHotelInventory() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactoryHotelInventory().getObject());
return transactionManager;
}
@Bean
@Qualifier("entityManagerFactoryReservation")
public JpaTransactionManager transactionManagerReservation() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactoryReservation().getObject());
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
@Autowired
private Environment env;
}
출력 >>
***************************
APPLICATION FAILED TO START
***************************
Description:
Method entityManagerFactoryHotelPos in com.test.poswebservice.configs.DBconfigs required a single bean, but 4 were found:
- dataSourceHotelPos: defined by method 'dataSourceHotelPos' in class path resource [com/test/poswebservice/configs/DBconfigs.class]
- dataSourceHotelFinance: defined by method 'dataSourceHotelFinance' in class path resource [com/test/poswebservice/configs/DBconfigs.class]
- dataSourceHotelInventory: defined by method 'dataSourceHotelInventory' in class path resource [com/test/poswebservice/configs/DBconfigs.class]
- dataSourceReservation: defined by method 'dataSourceReservation' in class path resource [com/test/poswebservice/configs/DBconfigs.class]
Action:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
@Qualifier 주석은이 문제를 피해야하지만 여기서는 어떻게 든 작동하지 않습니다. 내가 여기서 뭐하는거야? 어떤 도움은 매우 극명하게 될 것이다 :-(누군가가 저를 도와주세요, 이것은 거의 나를 죽이고
이감사
가이 방식으로 작동 내 설정에서
왜 여기에 '@ Primary' 데이터 소스 bean 중 하나를 만들어야합니까? (P.S. 이전 설정에서조차도 데이터 소스 빈을'@ primary'로 만들 때 오류가 없어졌습니다. 모든 EMF 빈에 대해 동일한 기본 데이터 소스를 사용하고 있다고 생각합니다. 다시 확인해 볼 것입니다.)'@ primary'는 단일 EMF 빈은 여러 개의 데이터 소스 빈을 받아 들일 것입니다. 하나는 기본이고 다른 하나는 선택적입니다. 그러나 제 경우에는 EMF 빈이 하나의 특정 데이터 소스 빈을 사용하기를 원합니다. 내가 잘못 생각한거야? 실마리를 미리 감사드립니다. – wannix
이 설정이 정상적으로 작동하지 않음을 확인할 수 있습니다. EMF 빈은 항상'@ Primary' 데이터 소스를 선택합니다. '@ DependsOn'에 의해 아무런 효과가 없습니다. '@ Primary'는 독재자입니다. – wannix