Hibernate, Spring i dwie bazy danych z mysql

Hibernate, Spring i dwie bazy danych z mysql
A7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 7 lat
  • Postów:18
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ą:

Kopiuj
@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.

SZ
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:616
0

ZIom co chcesz osiągnąć merytorycznie?

A7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 7 lat
  • Postów:18
0

W jednej aplikacji, chce mieć dostęp do dwóch baz danych w MySQL- używając Hibernate. Jedna jest pod URL: jdbc:mysql://localhost:3306/mysql1 a druga jest pod URL jdbc:mysql://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 :)

edytowany 1x, ostatnio: Alien777
SZ
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:616
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

edytowany 2x, ostatnio: Szczery
jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
0

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

@Bean(name = "dataSource")

pisz

@Bean @Qualifier("dataSource")`

Przeważnie ignoruję niezarejestrowanych użytkowników.
A7
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 7 lat
  • Postów:18
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ź.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.