19

データベースにエンティティを追加すると、正常に動作します。しかし、リストを取得すると、古いエンティティが取得されます。追加した新しいエンティティは、アプリケーションをアンデプロイして再度デプロイするまで表示されません。これは、エンティティがデフォルトでキャッシュされることを意味しますか? ただし、persistence.xml などのファイルでエンティティをキャッシュするための設定は行っていません。

私は、flush()、refresh()、およびmerge()を呼び出してみました。それでも、古いエンティティのみが表示されます。何か不足していますか?私を助けてください。

4

5 に答える 5

21

JPAへようこそ。これを使用する場合、JPA の外部でデータベースを更新すると、自分が何をしているのかを十分に理解して慎重に行わないと、大きな問題が発生することになります。これは、キャッシュされたエンティティを再ロードできるようにフラッシュする方法を理解する必要があることを意味します。

基本的に、JPA の外部でエンティティを更新しないでください。できる限り更新しないでください。更新する場合は、特定の JPA プロバイダーで使用されるキャッシュ モデルの動作に入る必要があります。JPAの外部で頻繁に更新する必要がある場合、JPAはおそらく適切な選択ではありません。

于 2010-04-25T10:49:19.137 に答える
13

これは、エンティティがデフォルトでキャッシュされることを意味しますか?

JPA 1.0 はL2 キャッシュ(「共有キャッシュ」) を定義せず、JPA 1.0 はL1 キャッシュ(「トランザクション キャッシュ」) のみを定義しますが、JPA プロバイダーは共有オブジェクト キャッシュをサポートできます。これは、キャッシュ用の JPA 拡張機能(JVM ごと)を介して L1 および L2 キャッシュをサポートする TopLink Essentials の場合です。

さて、すばらしい記事TopLink Essentials(GlassFish JPA) のキャッシュの理解で説明されているように:

  • 同じ永続性ユニットのすべての EntityManager は、セッション キャッシュを共有します (これが、TopLink が第 2 レベルのキャッシュを呼び出す方法です)。
  • セッション キャッシュはデフォルトでオンになっています。
  • 永続コンテキストにエンティティの変更/削除がある場合、それらはトランザクションがコミットされた後にセッション キャッシュに同期されるため、セッション キャッシュの状態が更新されます(または、そのようなキャッシュはまったく使用できなくなります)。

したがって、セットアップに何か他の問題があるはずです。次のプロパティを追加することで、テスト目的で (テスト目的でのみ) 共有セッション キャッシュを無効にすることができます。

<property name="toplink.cache.shared.default" value="false"/>

しかし、これで何かが変わるとは驚きです。おっしゃる通り、どこかに別の問題があると思います。

PS: これは質問の答えにはなりませんが、GlassFish v3 を使用している場合、EclipseLink を使用しないのはなぜですか?

更新: OP のコメントへの回答

したがって、従業員レコードを永続化すると、従業員のコレクションに明示的に追加するまで、データベースには表示されますが、部門内の従業員のコレクションには表示されません。これは必要なステップですか?

Java レベルでエンティティー間のリンクを作成しないと、JPA はデータベースでそれを作成できません (JPA は、ユーザーが指示したことしか実行しません)。したがって、はい、リンクを作成する必要があり、双方向の関連付けの場合は、リンクの両側を設定する必要さえあります (たとえば、employeeの従業員のコレクションに を追加し、 のDepartmentを設定しdepartmentますEmployee)。

于 2010-04-25T20:28:17.997 に答える
1

JPA 2.0 は共有 (L2) キャッシュを定義しますが、デフォルトを指定しません。EclipseLink はデフォルトでキャッシングを有効にしますが、他のプロバイダーはそうではありません。

EntityManager は、clear() を呼び出すか、新しいものを作成するまで、永続コンテキスト (L1) キャッシュを常に保持します。

共有キャッシュを無効にすることができます。

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Cachingを参照してください。

しかし、あなたの問題は、あなたがあなたの関係の両側を維持していないということです. 1-1 を設定すると、1-m に追加する必要があります。そうしないと、オブジェクトが無効になります。

キャッシングの詳細については、次を参照してください。

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching

于 2012-06-28T14:24:32.050 に答える
0

EntityManagerを使用していますか?そうでない場合は、 http://docs.oracle.com/javaee/5/api/javax/persistence/EntityManager.htmlを試してください。

データベースへの接続を管理するためにデータソースを使用していますか?あなたもそれを試してみるべきです。サーバーで構成されているxmlです。私たちがお手伝いできるように、アーキテクチャに関する詳細情報を提供してください。

于 2012-06-27T21:03:15.603 に答える