2012-05-01 6 views
3

JPAを使用してレコードを更新するのにベストプラクティスがどのようになるのだろうか?私は現在自分のパターンを考案しましたが、決してベストプラクティスではないと思います。私がしていることは、レコードがデータベースにあるかどうかを調べることです。見つからない場合は、enityManager.persist(object<T>)メソッドを呼び出します。それが存在する場合、私はentityManager.Merge(Object<T>)メソッドを呼び出します。openJPAを使用してレコードを更新するときのベストプラクティス

私が尋ねる理由は、マージメソッドがレコードがデータベースにすべて存在するかどうかを調べ、データベースにない場合はレコードを追加することですそれは、必要な変更を行います。また、getTransaction()。begin()およびgetTransaction.commit()でマージ・コールをネストする必要がありますか?ここでは、すでに保存しようとしているエンティティがIDを持っている場合は、私がこれまでに...

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

を持っているもので、それはデータベース内に存在している必要があります。それが存在しない場合は、他の誰かがエンティティを削除したことを意味し、それを更新することはあまり意味がないため、おそらく盲目的に再作成したくありません。

merge()メソッドは、まだ永続的ではない(IDまたはバージョンを持たない)エンティティを保持し、永続的である場合はエンティティを更新します。したがって、merge()を呼び出して(この呼び出しによって返された値をmerge()に戻す)以外は何もする必要はありません。

トランザクションは機能的なアトミック作業単位です。より高いレベル(サービス層内)で境界設定する必要があります。たとえば、アカウントから別のアカウントに資金を移すには、両方の変更が成功するか失敗するかを確認するために、両方のアカウントの更新を同じトランザクションで行う必要があります。ある口座からお金を取り除き、それを他の口座に追加しないと、大きな問題になります。

+0

本質的に私はif-else節を取り除くべきですか?なぜ私は値btwを返すのですか? – SoftwareSavant

+0

mergeは、分離されたエンティティから状態を取り、それを引数として取り込み、別の添付されたインスタンスにコピーするためです。コードの残りの部分は、分離されたインスタンスではなく、接続されたインスタンスを使用する必要があります。 –

+0

私はあなたの答えから理解しています。両方の場合にマージが使用されます。しかし、私はオブジェクトに変更がある場合のみ、オブジェクトを更新したいと思います。マージは賢明ですか?あるいは私は別の論理が必要ですか? – Kayser

関連する問題