也许我要问的是一个愚蠢的问题,如果有可能在Spring MVC配置中有两个entityManagerFactory,我想知道。我会解释原因。
我有一个LocalContainerEntityManagerFactoryBean,我在其中配置hibernate.tenant_identifier_resolver,我用它来通过LDAP使用用户的会话来确定租户,然后使用一个数据库Schema或另一个,然后我使用“multi_tenant_connection_provider”来创建数据库连接对于该架构。 现在我的应用程序有一个Scheduler,需要访问所有Schema并从所有数据库中获取一些信息。所以为了不触摸已经配置的entityManagerFactory,我想的是用“hibernate.tenant_identifier_resolver”创建一个新的实现,以控制我想要的模式而不是LDAP,然后通过“multi_tenant_connection_provider”创建数据库连接。 问题看起来像Spring不允许我配置两个entityManagerFactory。 你能给我一些关于如何实现我想要的建议吗?
问候!
答案 0 :(得分:1)
是的,可以使用多个EntityManagers。 在我的项目中,我使用注释配置,我有:
@Configuration
@EnableTransactionManagement
public class AppConfig {
@Bean
public SessionFactory smartDataSessionFactory() {
return new LocalSessionFactoryBuilder(smartDataDatasource())
.scanPackages("...)
.addProperties(smartDataHibernateProperties())
.buildSessionFactory();
}
@Bean
public SessionFactory analysisSessionFactory() {
return new LocalSessionFactoryBuilder(analysisDatasource())
.scanPackages("...)
.addProperties(analysisHibernateProperties())
.buildSessionFactory();
}
...
}
引用entityManager时,请务必使用限定符注释。 另请注意,每个SessionFactory都将使用它自己的TransactionFactory
@Repository
@Transactional(value = "analysisTransactionManager")
public class ToURemunerationDaoImpl implements ToURemunerationDao {
private SessionFactory analysisSessionFactory;
private SessionFactory smartDataSessionFactory;
@Autowired
@Qualifier("analysisSessionFactory")
public void setAnalysisSessionFactory(SessionFactory sessionFactory) {
this.analysisSessionFactory = sessionFactory;
}
@Autowired
@Qualifier("smartDataSessionFactory")
public void setSmartDataSessionFactory(SessionFactory sessionFactory) {
this.smartDataSessionFactory = sessionFactory;
}
...
}
答案 1 :(得分:0)
最后我找到了解决方案。问题是因为我使用的是Spring数据,而我的存储库并没有使用哪个EntityManagerFactory。一旦我指定在扫描期间使用哪一个,一切都像魅力一样。
<repositories base-package="com.*.*.repository**" entity-manager-factory-ref="entityManagerFactory"/>