创建两个entityManagerFactory

时间:2014-03-11 08:43:21

标签: java spring hibernate spring-mvc

也许我要问的是一个愚蠢的问题,如果有可能在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。 你能给我一些关于如何实现我想要的建议吗?

问候!

2 个答案:

答案 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"/>