2011-11-18 97 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 

//---