0

JPAを使用して既存のレコードを更新しようとしています。次のリンクは、レコードを更新する唯一の方法は、レコードの更新クエリを作成することであることを示唆しているよう です。ここにリンクの説明を入力してください

どちらでも構いません。しかし、繰り返しになりますが、なぜこれをストアドプロシージャから引き出して、オープンJPAの魔法をすべて使用するのでしょうか。JPAオブジェクトのインスタンスがある場合、これと同様の呼び出しを使用してデータベースに永続化しようとすると、

emf.persist(launchRet)

JPAフレームワークは、レコードがすでに存在するかどうかを確認し、存在する場合は、そのレコードに変更を加えます。存在しない場合は、新しいレコードを追加するだけです。本当にかっこいいです。代わりに、更新クエリでそのロジックをすべて自分で作成する必要があります。これは問題ありませんが、ストアドプロシージャを使用して、必要なすべての値を渡すことができないのはなぜですか?

更新:私の最後のコメントがすべてについて説明しているコード

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

変数launchがメソッドに渡されます...

public QuickLaunch UpdateQuickLaunchComponent(QuickLaunch launch) 

見つかった起動launchRetを渡された起動と等しく設定するだけで簡単ですか?

4

1 に答える 1

1

あなたが投稿したリンクを読んでください:

次のいずれかの方法でエンティティインスタンスを変更できます。

  • 更新クエリの使用
  • エンティティのパブリックAPIの使用[...]

ケースの99%で使用される方法は、2番目の方法です。

Foo someExistingFoo = em.find(Foo.class, someExistingFooId);
someExistingFoo.setSomeValue(theNewValue);
// no need to call any persist method: the EM will flush the new state 
// of the entity to the database when needed

もちろん、エンティティは、クエリを介して、またはエンティティのグラフをナビゲートすることによってロードすることもできます。

デタッチされたエンティティがあり、その状態をデータベースに保持する場合は、このEntityManager.merge()メソッドを使用します。引数として渡されたデタッチされたエンティティと同じIDを持つエンティティを検索し、デタッチされたエンティティからアタッチされたエンティティに状態をコピーして、アタッチされたエンティティを返します。

Foo attachedModifiedFoo = em.merge(detachedFoo);

デタッチされたエンティティが永続的でない場合(つまり、IDがない場合)、それが作成され、永続的になります。

于 2012-04-30T18:21:57.107 に答える