2016-09-29 21 views
2

ここでは、4つのJPAエンティティマネージャを使用してSpringブートアプリケーションを使用して4つのMySQLデータソースを設定しようとしています。私は春と春の新作です。私はこれを探究してヒントを得ましたが、結果は非常に混乱していました。構成のアプローチがたくさんありますが(マルチデータソースを扱うためのものではありません)、何に従うべきか分かりません。最終的には、MySQLデータソースごとに4つの別個のエンティティマネージャを設定し、トランザクションで別々に使用するようにしています。@QualifierがSpring起動時に複数のDataSource Beanで動作しない場合

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を削除しますあなたのEMF豆
  2. は、あらゆるEMFビーンに追加:正しいDataSource
  3. @DependsOn({"dataSource"})を実際DataSource@Primary
  4. 012のものを作ります
+0

なぜここでデータソースBeanの1つを「@プライマリ」にする必要がありますか?(P。以前の設定でも、データソースBeanを '@ primary'にするとエラーがなくなりました。すべてのEMF beanに対して同じプライマリデータソースを使用していると思います。 EMF Beanは複数のデータソースBeanを受け入れるでしょうか? 1つはプライマリ、もう1つはオプションですか?しかし、私の場合は、EMF Beanに特定のデータソースBeanを使用させたいだけです。私は間違ったことを考え出していますか?事前に感謝の手紙をありがとう。 – wannix

+1

私は、この設定が想定どおりに動作していないことを確認できます。 EMF Beanは常に '@ Primary'データソースを選択します。 '@ DependsOn'では何の効果もありません。 '@ Primary'は独裁者です。 – wannix

関連する問題