3

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

私が尋ねる理由は、mergeメソッドがレコードがデータベースにすでに存在するかどうかを確認し、データベースに存在しない場合は追加に進むことを発見したためです。必要な変更。また、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

1 に答える 1

4

保存しようとしているエンティティにすでにIDがある場合は、データベースに存在している必要があります。存在しない場合は、他の誰かがエンティティを削除したことを意味し、更新してもあまり意味がないため、やみくもに再作成したくないでしょう。

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

トランザクションは、機能的なアトミックな作業単位です。上位レベル(サービスレイヤー内)で境界を設定する必要があります。たとえば、あるアカウントから別のアカウントに送金するには、両方のアカウントの更新を同じトランザクションで実行して、両方の変更が成功または失敗するようにする必要があります。一方のアカウントからお金を削除し、もう一方のアカウントに追加できないと、大きなバグになります。

于 2012-05-01T12:05:50.847 に答える