gpt4 book ai didi

java - Spring jpa - 不能使用多个 EntityManagerFactory

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:02 25 4
gpt4 key购买 nike

我正在开发一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com