2012-01-18 16 views
0

JPAの実装では、オブジェクトのリストを選択してこれらのオブジェクトを変更するem.find()を行います。次に、トランザクション内でem.merge()を呼び出すこれらの変更されたオブジェクトを更新します他の関連するものを維持するために)。JPAの検索と更新の戦略

これは、SELECTが2回起こっているという事実を除いて素晴らしいことです(私の場合は、冗長でパフォーマンスが良いと感じています)。

em.merge()のトランザクション境界内でfind()を使用することに後者のSELECTを解決しても、私は消極的です。

別のSELECTを発行せずにこれらのオブジェクトを更新する唯一の方法は、独自のNamedQueryを定義することですか?

おかげ

+0

2番目のSELECTはどこで実行されるのか指定できますか? – perissf

+0

find()コールをトランクに持ち込むことになぜ消極的ですか?あなたはどのプロバイダを使用していますか? – Rick

+0

@Rick Selectは(インデックスされていない列のクエリのため)実行に数分かかります。選択実行のための追加時間は、トランザクションのトランザクション時間(JBOSSの制限は5分)です。私は潜在的に時間を増やすことができますが、これを最後のresportオプションとして保持します。 – phewataal

答えて

0

あなたはJTAを使用している場合は、各トランザクションの境界が新しい永続コンテキストになり、あなたが設定され、共有キャッシュを持っていない限り、あなたが戻ってデータベースに移動する必要がありますその後、EntityManagerを管理します。

どのJPAプロバイダをお使いですか? EclipseLinkを使用している場合、共有キャッシュはデフォルトで有効になっています。

JPAトランザクションの場合、同じEntityManagerを検索およびマージに使用する場合、依然として永続コンテキスト内にあるはずです。

+0

JPAプロバイダとしてHibernateを使用しています。私のコードではEntitymanagerはDAO内のインスタンス変数として定義されています.DAOはビジネスロジックを含むBeanで@EJBを使って参照されます。ここで私はdao.find()とdao.merge()を呼び出しています。これは私がすべてのDAOコールに対して異なるEMを使用していることを意味しますか? – phewataal

関連する問題