Hibernate, Spring i dwie bazy danych z mysql

0

Cześć, Mam problem z zaimplementowaniem dwóch sesji dla osobnych baz danych. Podczas kompilacji programu dostaje komunikat:

Description:

Parameter 0 of method sessionFactory in pl.lasota.databaseaccess.ConfigBeanForDatabase required a single bean, but 2 were found: - dataSource: defined by method 'dataSource' in class path resource [pl/lasota/databaseaccess/ConfigBeanForDatabase.class] - dataSourceUser: defined by method 'dataSourceUser' in class path resource [pl/lasota/databaseaccess/ConfigBeanForDatabase.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

Moja klasa z konfiguracją:

@Configuration
public class ConfigBeanForDatabase {

 @Bean(name = "dataSource")
 public DataSource dataSource() {
  BasicDataSource dataSource = new BasicDataSource();
  dataSource.setDriverClassName("com.mysql.jdbc.Driver");
  dataSource.setUrl("jdbc:mysql://localhost:3306/mysql1");
  dataSource.setUsername("****");
  dataSource.setPassword("****");
  return dataSource;
 }

 @Autowired
 @Bean(name = "sessionFactory")
 public SessionFactory sessionFactory(
  @Qualifier("dataSource") DataSource dataSource) {
  LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
  sessionBuilder.addProperties(getHibernateProperties());
  sessionBuilder.addAnnotatedClasses(Comment.class);
  return sessionBuilder.buildSessionFactory();
 }

 @Autowired
 @Bean
 public HibernateTransactionManager transactionManager(
  @Qualifier("sessionFactory") SessionFactory sessionFactory) {
  HibernateTransactionManager transactionManager = new HibernateTransactionManager(
   sessionFactory);
  return transactionManager;
 }
 @Autowired
 @Bean
 public MysqlPlaceDaoImpl mysqlPlaceDaoImpl(@Qualifier("sessionFactory") SessionFactory sessionFactory) {
  return new MysqlPlaceDaoImpl(sessionFactory);
 }

 @Autowired
 @Bean
 public MysqlSiteDaoImpl mysqlSiteDaoImpl(@Qualifier("sessionFactory") SessionFactory sessionFactory) {
  return new MysqlSiteDaoImpl(sessionFactory);
 }





 @Bean(name = "dataSourceUser")
 public DataSource dataSourceUser() {
  BasicDataSource dataSource = new BasicDataSource();
  dataSource.setDriverClassName("com.mysql.jdbc.Driver");
  dataSource.setUrl("jdbc:mysql://localhost:3306/mysql2");
  dataSource.setUsername("****");
  dataSource.setPassword("****");
  return dataSource;
 }

 @Autowired
 @Bean(name = "sessionFactoryUser")
 public SessionFactory sessionFactoryUser(@Qualifier("dataSourceUser") DataSource dataSource) {
  LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
  sessionBuilder.addProperties(getHibernateProperties());
  sessionBuilder.addAnnotatedClasses(User.class);
  return sessionBuilder.buildSessionFactory();
 }

 @Autowired
 @Bean
 public HibernateTransactionManager transactionManagerUser(
  @Qualifier("sessionFactoryUser") SessionFactory sessionFactory) {
  HibernateTransactionManager transactionManager = new HibernateTransactionManager(
   sessionFactory);
  return transactionManager;
 }


 @Autowired
 @Bean
 public MysqlUserDaoImpl mysqlUserDaoImpl(@Qualifier("sessionFactoryUser") SessionFactory sessionFactory) {
  return new MysqlUserDaoImpl(sessionFactory);
 }


 private Properties getHibernateProperties() {
  Properties properties = new Properties();
  properties.put("hibernate.show_sql", "true");
  properties.put(" hibernate.cache.provider_configuration_file_resource_path", "ehcache.xml");
  properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
  properties.put("hibernate.hbm2ddl.auto", "update");
  properties.put("hibernate.connection.useUnicode", true);
  properties.put("hibernate.connection.characterEncoding", "UTF-8");
  properties.put("hibernate.cache.use_second_level_cache", true);
  properties.put("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");
  return properties;
 }
}

Próbowałem dodawać @primary do DataSource ale dostaje błąd, że Hibernate nie wie co to jest User persistant. Poza tym nie chce uzywać @primary bo co jesli będę chciał dodać kolejną konfigurację do innej bazy danych w mysql? Próbowałem dzielić klasę konfigurayjną na dwie, ale to nic nie dało.

0

ZIom co chcesz osiągnąć merytorycznie?

0

W jednej aplikacji, chce mieć dostęp do dwóch baz danych w MySQL- używając Hibernate. Jedna jest pod URL: jdbc//localhost:3306/mysql1 a druga jest pod URL jdbc//localhost:3306/mysql2. I żeby to zrobić muszę mieć dwie instancje "session factory"- jeden session factory dla jednej drugi dla drugiej. Bo tabele dla np użytkownika mam w bazie o nazwie "mysql1" a tlumaczenie strony (kontent strony) mam w bazie o nazwie "mysql2". Myślę, że wiesz o co mi chodzi :)

0

Hibernate przewiduje tenanty może CI to się sprawdzi https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch16.html

A jak chcesz miec dwie fakryki to musisz je nazwac(idiki), oraz podczas wstrzykiwania rowniez te idiki dawac, to niestety rodzi problemy ala transaction manager domyslenie dziala na jednym sessionFactory ewentualnie przejscie na JTA. Ja bym chyba zrobił to czystym JDBC/Query DSL

0

Nazwa beana to nie to samo, co qualifier. Więc zamiast

@Bean(name = "dataSource")

pisz

@Bean @Qualifier("dataSource")`
0

Czyli najlepszym rozwiązaniem będzie użycie tenantów ? Spróbuj wdrożyć, mam nadzieję, że mi sie uda, Dzięki za odpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1