在运行时修改Spring LocalContainerEntityManageFactoryBean以更改Hibernate方言

时间:2016-10-21 18:00:45

标签: java spring hibernate jpa

我们正在使用spring LocalContainerEntityManageFactoryBean。问题是我们必须在多租户环境中连接不同的数据库。需要找出一种方法,我们可以在运行时更改方言的LocalcontainerEntityMangerFactory bean jpa属性而无需重启

1 个答案:

答案 0 :(得分:0)

相反,您应该做的是使用适当的方言初始化两个不同的LocalContainerEntityManagerFactoryBean实例,然后根据代码应与之交互的数据库引用正确的EntityManager

@PersistenceContext(unitName = "dialect1PersistenceUnit")
private EntityManager entityManager1;

@PersistenceContext(unitName = "dialect2PersistenceUnit")
private EntityManager entityManager2;

如果事情必须真正动态,你有几个选择。

如果您打算一次只使用一个数据源,则可以设置数据库,使其基于AbstractRoutingDataSource并设置一个线程本地值,以确定要使用的持久性上下文。通常,在调用事务管理方面之前,您需要在服务层包装器中设置线程本地值。

另一种选择是注入EntityManagerFactory而不是EntityManager并动态构建自己的EntityManager,如下所示:

Map props = new HashMap();
props.put( "org.hibernate.dialect", YourDialectClass.class.getName() );

EntityManager entityManager = entityManagerFactory.createEntityManager( props );

HTH。