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.