【问题标题】:How to change Persistence Unit dynamically?如何动态更改持久性单位?
【发布时间】:2014-11-21 09:18:54
【问题描述】:
我有一个 Spring MVC + Hibernate + JPA 应用程序。在我的数据库中也有 4 个不同的模式和类似的表。 (针对不同的公司)。
现在当我使用我的 Hibernate 应用程序时,我可以切换 Persistence Unit 吗?
我可以使用相同的表单(具有相同的内容)来保存数据
所有四个架构?
我知道我可以在运行时切换持久性单元,但我希望能够通过更改持久性单元来使用已经加载的表单将数据保存到所有四个模式。
【问题讨论】:
标签:
java
spring
hibernate
jpa
persistence.xml
【解决方案1】:
前段时间我也遇到过类似的问题。
我有 2 个相同的模式 - 应用程序必须根据某些逻辑坚持到第一个或第二个。
它是纯 Hibernate,但就 JPA 而言,我建议在您的 persistence.xml 中定义 4 个持久性单元:
persistence.xml
<persistence-unit name="PU1">
...
</persistence-unit>
<persistence-unit name="PU2">
...
</persistence-unit>
[...]
以及注入 EntityManager 代理的 DAO 类 - 每个用于不同的 PU:
@Repository
public class MyDaoImpl implements MyDao {
@PersistenceContext(unitName = "PU1")
private EntityManager em1;
@PersistenceContext(unitName = "PU2")
private EntityManager em2;
...
public void saveToPU1(MyEntity e) {
em1.persist(e);
}
public void saveToPU2(MyEntity e) {
em2.persist(e);
}
...
}
当然,带有@PersistenceContext(unitName="PU1") 注释的em1 是Spring 对Hibernate 会话的代理,并且只有当该线程尝试使用它时才会打开并与当前线程绑定。