【发布时间】:2015-10-02 19:44:32
【问题描述】:
我正在开发一个使用 hibernate 和 jpa 作为持久层的 java spring mvc 应用程序。我有 2 个数据库,我想在 database1 中映射一些实体表,在 database2 中映射一些实体表。所以我定义了两个这样的配置类:
第一:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(value = "com.mycompany.project.persistence.orm.module.common",entityManagerFactoryRef = "commonEntityManagerFactory",transactionManagerRef = "commonTransactionManager")
public class PersistenceConfigCommon {
public PersistenceConfigCommon() {
}
Properties additionalProperties() {
return new Properties() {
{
setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
setProperty("hibernate.hbm2ddl.auto", "update");
setProperty("hibernate.show_sql", "true");
setProperty("hibernate.enable_lazy_load_no_trans", "true");
setProperty("hibernate.connection.CharSet", "utf8");
setProperty("hibernate.connection.characterEncoding", "utf8");
setProperty("hibernate.connection.useUnicode", "true");
}
};
}
@Primary
@Bean(name = "commonEntityManagerFactory")
public EntityManagerFactory commonEntityManagerFactory() {entityManagerFactoryBean");
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setPersistenceUnitName("common");
factory.setDataSource(commonDataSource());
factory.setPackagesToScan("com.mycompany.project.persistence.orm.module");
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(Boolean.TRUE);
vendorAdapter.setShowSql(Boolean.TRUE);
factory.setJpaVendorAdapter(vendorAdapter);
factory.setJpaProperties(additionalProperties());
factory.afterPropertiesSet();
return factory.getObject();
}
@Primary
@Bean(name = "commonDataSource")
public DataSource commonDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://10.10.1.11:3306/database1?characterEncoding=UTF-8");
dataSource.setUsername("fpuser");
dataSource.setPassword("fpdb$123456");
return dataSource;
}
@Primary
@Bean(name = "commonTransactionManager")
public PlatformTransactionManager commonTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(commonEntityManagerFactory());
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
第二:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(value = "com.mycompany.project.persistence.orm.module.profile",entityManagerFactoryRef = "profileEntityManagerFactory",transactionManagerRef = "profileTransactionManager")
public class PersistenceConfigProfile {
public PersistenceConfigProfile() {
}
Properties additionalProperties() {
return new Properties() {
{
setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
setProperty("hibernate.hbm2ddl.auto", "update");
setProperty("hibernate.show_sql", "true");
setProperty("hibernate.enable_lazy_load_no_trans", "true");
setProperty("hibernate.connection.CharSet", "utf8");
setProperty("hibernate.connection.characterEncoding", "utf8");
setProperty("hibernate.connection.useUnicode", "true");
}
};
}
@Primary
@Bean(name = "profileEntityManagerFactory")
public EntityManagerFactory profileEntityManagerFactory() {entityManagerFactoryBean");
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setPersistenceUnitName("profile");
factory.setDataSource(profileDataSource());
factory.setPackagesToScan("com.mycompany.project.persistence.orm.module");
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(Boolean.TRUE);
vendorAdapter.setShowSql(Boolean.TRUE);
factory.setJpaVendorAdapter(vendorAdapter);
factory.setJpaProperties(additionalProperties());
factory.afterPropertiesSet();
return factory.getObject();
}
@Primary
@Bean(name = "profileDataSource")
public DataSource profileDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://10.10.1.63:3306/database2?characterEncoding=UTF-8");
dataSource.setUsername("fpuser");
dataSource.setPassword("fpdb$123456");
return dataSource;
}
@Primary
@Bean(name = "profileTransactionManager")
public PlatformTransactionManager commonTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(commonEntityManagerFactory());
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
请注意,这两个文件中的所有内容都相似,只是 common 已在第二个文件中转换为 profile 并且数据库名称和 ip 已更改。在 DAO 中我也写了这个:
@PersistenceContext(unitName = "common") //or "profile"
protected EntityManager entityManager;
@Override
public EntityManager getEntityManager() {
return entityManager;
}
现在,当我运行项目时,出现以下异常:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: expected single matching bean but found 2: commonEntityManagerFactory,profileEntityManagerFactory
我已经在这个异常中停留了 2 天。谁能帮我解决这个问题。感谢您的宝贵时间。
【问题讨论】:
标签: java hibernate spring-mvc jpa entitymanager