我正在开发一个 java spring mvc 应用程序,该应用程序使用 hibernate 和 jpa 作为持久层。我有 2 个数据库,我想映射数据库 1 中的一些实体表和数据库 2 中的一些实体表。所以我定义了两个这样的配置类:
第一:
@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
我已经被这个异常困住了两天了。谁能帮我解决这个问题。感谢您抽出时间。
最佳答案
您尚未将“common”
定义为unitName,并且您有两个@Primary
注释。
尝试配置:
@Bean(name = "common")
改为 @Bean(name = "commonEntityManagerFactory")
关于java - Spring jpa - 不能使用多个 EntityManagerFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31402091/