2016-09-29 2 views
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 주석은이 문제를 피해야하지만 여기서는 어떻게 든 작동하지 않습니다. 내가 여기서 뭐하는거야? 어떤 도움은 매우 극명하게 될 것이다 :-(누군가가 저를 도와주세요, 이것은 거의 나를 죽이고

감사

가이 방식으로 작동 내 설정에서

답변

0

는 것을 :..

  1. 가에서 @Qualifier를 제거 @DependsOn({"dataSource"})을 올바른 DataSource
  2. 와 실제로 DataSource@Primary
  3. 012 중 하나를 만들 :
  4. 모든 EMF 콩에 추가하여 EMF 콩
+0

왜 여기에 '@ Primary' 데이터 소스 bean 중 하나를 만들어야합니까? (P.S. 이전 설정에서조차도 데이터 소스 빈을'@ primary'로 만들 때 오류가 없어졌습니다. 모든 EMF 빈에 대해 동일한 기본 데이터 소스를 사용하고 있다고 생각합니다. 다시 확인해 볼 것입니다.)'@ primary'는 단일 EMF 빈은 여러 개의 데이터 소스 빈을 받아 들일 것입니다. 하나는 기본이고 다른 하나는 선택적입니다. 그러나 제 경우에는 EMF 빈이 하나의 특정 데이터 소스 빈을 사용하기를 원합니다. 내가 잘못 생각한거야? 실마리를 미리 감사드립니다. – wannix

+1

이 설정이 정상적으로 작동하지 않음을 확인할 수 있습니다. EMF 빈은 항상'@ Primary' 데이터 소스를 선택합니다. '@ DependsOn'에 의해 아무런 효과가 없습니다. '@ Primary'는 독재자입니다. – wannix

관련 문제