2016-09-29 2 views
2

Я пытаюсь здесь настроить четыре источника данных MySQL с помощью весеннего загрузочного приложения с использованием четырех сущностей-менеджеров JPA. Я новичок в весеннем и весеннем ботинках. Я искал это, чтобы понять, но результаты были очень запутанными, существует множество подходов к настройкам (но не для обработки нескольких источников данных), я не уверен, что следует соблюдать. В конце концов я пытаюсь настроить четыре отдельных менеджера сущностей для каждого источника данных 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 ваши EMF бобы
  2. Добавить на каждом EMF Bean: @DependsOn({"dataSource"}) с правильным DataSource
  3. Действительно сделать одно из DataSource s @Primary
+0

Почему мы должны делать одну из фаз источника данных '@ Primary' здесь? (P.S. даже в моей предыдущей настройке ошибки удалились при создании источника данных '@ primary', я предполагаю, что он использует один и тот же первичный источник данных для каждого компонента EMF, я подтвержу, что проверка снова.) Создание' @ primary' означает одиночный EMF bean будет принимать несколько источников данных, верно? один как первичный, а другой - как необязательный? Но в моем случае я просто хочу, чтобы компонент EMF использовал один конкретный компонент источника данных. я что-то не понял? заранее спасибо за подсказку. – wannix

+1

Я могу подтвердить, что эта настройка не работает, как предполагалось. EMF bean всегда выбирает источник данных '@ Primary'. Никакой эффект от «@ DependsOn». '@ Primary' - диктатор. – wannix

Смежные вопросы