2011-11-18 96 views
3

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

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

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

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

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

+0

有关您正在尝试执行的操作的更多信息,以及您为什么关心此特定实例保持最新状态可能会有帮助。一般来说,最好通过使用内存中的L2缓存并仅使用entityManager.find()来实现,而不是试图维护自己。还可以选择扩展EntityManager的范围以适应您的工作单元。 – Affe

+0

我有一个单身模型,我的应用程序是分布式的。我想知道其他客户端中的任何更改都保留在数据库中,因此我可以更新我的模型实例。但是,我不能失去实体实例,因为程序的其他部分可能会使用该实例(例如树视图)。 – tproenca

回答

0

为了避免在刷新之后刷新&获得分离,可以实现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 

//---