2009-09-23 1 views
5

JPA:一貫性コンテキストを一括更新または削除の結果と同期させるにはどうすればよいですか?

永続コンテキストは、一括更新の結果と同期したり

だから私の場合、削除されていない読み込みのejb-3_0-FR-SPEC-persistence.pdf内のステートメントがありますテーブルから行を削除するquery.executeUpdateを実行します。これらの同じ行は、依然として別のエンティティの1対多コレクションに存在します。アプリケーションを再起動すると、ファントムエンティティがコレクションから削除されているのがわかります。

JPAのキャッシュを一括更新\削除の結果と同期させる(nice \ simple \ generic)方法はありますか?

BTW。 EclipseLink、バージョン:Eclipse Persistence Services - 1.1.0.r3634を使用しています。

おかげで、

フィル。

+1

私は[http://stackoverflow.com/questions/5832415/entitymanager-refresh][1]があると思います。それは実際に私のために働いた。 [1]:http://stackoverflow.com/questions/5832415/entitymanager-refresh –

答えて

5

ここで「キャッシュ」という言葉をどのように使用するかは、異なることを意味するため注意が必要です。

強調表示されたフレーズは、「第1レベルキャッシュ」と考えることができる永続コンテキストについて語ります。 単一エンティティの状態をリフレッシュする

  1. コールEntityManager.refresh():あなたがいずれかのことができ、データベースから最新の変更で更新するために。
  2. ORはエンティティマネージャのインスタンスを完全に破棄し(必要に応じて変更をフラッシュ/クリアした後)、エンティティマネージャのファクトリから新しいインスタンスを取得します。この新しいインスタンス内からロードするエンティティはすべてデータベースからロードされ、最新の変更が含まれます。

また、特定のエンティティマネージャにバインドされていない「第2レベルのキャッシュ」も存在する可能性があります。独自のAPIを使用してリフレッシュすることができます(または、キャッシュ・プロバイダーによって異なります)。

1

永続コンテキストは更新および削除操作の結果を反映するように更新されません。トランザクションスコープの永続コンテキストを使用する場合は、トランザクション内でバルク操作を単独で実行するか、トランザクションの最初の操作にする必要があります(「EclipseLinkトランザクションの概要」を参照)。これは、永続コンテキストによってアクティブに管理されているエンティティは、データベースレベルで発生した実際の変更を認識していないためです。

これは、あなたがキャッシュされたデータを消去する方法であるhttp://puspendu.wordpress.com/2010/12/22/sync-jpa-database-multiple-application/

4

で、ここで私をノックして、快適なフェル。

entityManager.getEntityManagerFactory().getCache().evictAll(); 
+0

はパフォーマンスについてそのように進めたらどう? –

1

第1レベルのキャッシュ(EntityManager /トランザクション)は、手動で更新またはクリアする必要があります。オブジェクトをリフレッシュするか、clear()を呼び出すか、新しいEntityManagerを取得することができます。

2次キャッシュ(共有キャッシュ)は、トランザクションをコミットすると自動的に無効になるはずです。なんらかの理由でなければ、JPA Cache APIまたはEclipseLink JpaCache APIを使用してオブジェクトを除去または無効化するか、オブジェクトをリフレッシュすることができます。


関連する問題