【问题标题】: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 会话的代理,并且只有当该线程尝试使用它时才会打开并与当前线程绑定。

    【讨论】:

      【解决方案2】:

      我不确定是否理解您的问题:当然您可以使用Persistence#createEntityManagerFactory(String persistenceUnitName) 方法更改运行时使用的 PersistentUnit。

      如果你愿意

      将数据保存到所有四个模式

      然后你应该重复你的操作(我猜是坚持)四次(例如在一个以持久性单元名称作为参数的私有方法中)。

      如果您想重用已加载的表单,您可以引入表单缓存,但这是一个软件架构问题。

      正如in the Java EE 5 tutorial 所建议的那样,从软件设计的角度来看,具有直接依赖于 JPA 层的表单并不是最佳实践。另一个答案表明:DAO 可能是解决方案。一切都与您的 DAO 生命周期有关。

      Core JEE 模式书suggests it(在线参考仅简要提及主题,印刷书更好):将DAO 与Factory pattern 关联是个好主意。你可以回收 EntityManagerFactory 或任何你想要的东西。

      【讨论】:

        猜你喜欢
        • 2013-09-06
        • 1970-01-01
        • 1970-01-01
        • 2015-02-01
        • 2016-10-27
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 1970-01-01
        相关资源
        最近更新 更多