2012-05-01 31 views
3

我想知道使用JPA更新記錄的最佳做法是什麼?我目前制定了自己的模式,但我懷疑這絕不是最佳做法。我所做的實質上是查看記錄是否在分貝中,如果我沒有找到它,我會調用enityManager.persist(object<T>)方法。如果確實存在,我打電話給entityManager.Merge(Object<T>)方法。當使用openJPA更新記錄時的最佳實踐

我問的原因是我發現merge方法查看記錄是否在數據庫中已準備好,如果它不在db中,那麼它會繼續添加它,如果它是,它使必要的變化。另外,是否需要在getTransaction()。begin()和getTransaction.commit()中嵌套合併調用?以下是我迄今爲止...

try{ 
     launchRet = emf.find(QuickLaunch.class, launch.getQuickLaunchId()); 
     if(launchRet!=null){ 
      launchRet = emf.merge(launch); 
     } 
     else{ 
      emf.getTransaction().begin(); 
      emf.persist(launch); 
      emf.getTransaction().commit(); 
     } 
    } 

回答

4

如果你想保存已經實體有一個ID,那麼它必須存在於數據庫中。如果它不存在,你可能不想盲目地重新創建它,因爲這意味着別人已經刪除了實體,更新它沒有多大意義。

merge()方法持續存在尚未持久化的實體(沒有ID或版本),並在實體持續時更新實體。因此,除了調用merge()(並將此調用返回的值返回merge())之外,您無需執行任何操作。

交易是一個功能原子工作單元。它應該在更高層次(在服務層)進行劃分。例如,從一個賬戶轉賬到另一個賬戶需要在同一個交易中完成賬戶更新,以確保兩個變更都成功或失敗。從一個帳戶中刪除資金並且無法將其添加到另一個帳戶將是一個主要的錯誤。

+0

所以基本上我應該擺脫我有的if-else子句?爲什麼我會返回價值btw? – SoftwareSavant

+0

由於合併從分離的實體中獲取狀態,因此將其作爲參數,並將其複製到另一個附加的實例。其餘的代碼應該使用附加的實例而不是分離的實例。 –

+0

據我的理解你的答案。合併用於這兩種情況。但是我只想在對象發生變化時更新對象。合併巧妙嗎?或者我需要另一種邏輯? – Kayser