【问题标题】:Refresh entities in JPA刷新 JPA 中的实体
【发布时间】:2011-11-18 19:44:45
【问题描述】:

我对如何刷新数据库中已有实体的状态感到困惑。更具体地说,假设我有这样的代码坚持“实体”:

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(entity);
em.getTransaction().commit();
entityManager.close();

自从我关闭 EntityManager 后,我的实体实例就被分离了。现在假设我有其他对象使用这个实体实例。如果我想从数据库中获取这个实体的新状态,我几乎不能使用 em.refresh() 因为实体是分离的。 em.merge() 方法返回一个托管实例,由于不是我的对象的同一个实例,这可能是一个问题。我可以预见两种解决方案:

  1. 在我的实体对象中创建一个使用给定实体实例更新其状态的新方法。
  2. 不关闭实体管理器(含义!??)

那么,在这种情况下我应该怎么做?如何在不丢失其他对象的所有引用的情况下刷新实体对象的状态?想法?

【问题讨论】:

  • 更多关于您正在尝试做什么以及您为什么关心此特定实例保持最新的信息可能会有所帮助。通常,使用内存中的 L2 缓存并仅使用 entityManager.find() 比尝试自己维护它更好。还有一些选项可以扩大 EntityManager 的范围以适应您的工作单元。
  • 我有一个单例模型,我的应用程序是分布式的。我想知道持久化到数据库的其他客户端的任何更改,因此我可以更新我的模型实例。但是,我不能失去我的实体实例,因为程序的其他部分可能正在使用它(例如,树视图)。

标签: java jpa jpa-2.0


【解决方案1】:

如果实体 A 引用已分离的实体 B,则合并 B 返回 B',并刷新 B'。如果合并 A,A 会将其对 B 的引用更改为 B'。

A ---> B --(merge)--->B'
                    (refresh)
                    /
merge A -----------/

【讨论】:

    【解决方案2】:

    为了避免通过刷新和在持久化后分离来对实体进行更改,可以实现Cloneable接口然后对克隆的实体进行相应的处理。

    //---
    
    XEntity cloneX = (XEntity) entity.clone();
    
    cloneX = entityManager.merge(cloneX);/* Persisting & getting synchronized copy */ 
    // entityManager.refresh(cloneX); /* not need */
    
    cloneX.copyTo(entity); // Add required changes back to entity if any
    
    //---
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      相关资源
      最近更新 更多