1

私は hibernate エンティティ マネージャ 3.4.0.GA を使用していますが、問題が発生しています。2 つのエンティティ マネージャ インスタンスem1em2があり、1 つのエンティティがあります。em1のエンティティを更新してからem2で選択しますが、 em2はデータベースに対して選択を行いますが、エンティティには古い値があります(更新前)。私が間違っていること:(

正確な手順はem1(T1)にあり、エンティティをフェッチして更新し、T1をコミットして変更をデータベースに保存し、em2(T2)ですべてのエンティティをフェッチするjpaクエリを作成しますが、エンティティ(正常に更新された) T1 では) 第 1 レベルのキャッシュから読み取られるため、古い値が保持されます :(.

4

2 に答える 2

3

レベル - 1 :このキャッシュのスコープはEntityManagerまたはPersistenceContext(Hibernate には使用されませんが、おそらくセッションになります)。

レベル - 2 :その範囲はEntityManagerFactory& キャッシュされたオブジェクトは、アプリケーション内の任意のエンティティ マネージャーによって取得できます。

2 つの異なるエンティティ マネージャーを使用しているため、オブジェクトは第 1 レベルのキャッシュからではなく、第 2 レベルのキャッシュから読み込まれます。したがって、そこから古いオブジェクトを取得します。

  • 試すことができsession.setCacheMode(CacheMode.REFRESH)ます。

    それ以外の場合は、クエリ自体にヒントを設定できます。

    @NamedQuery(name="queryWithNoCache", query="SELECT e FROM Entity e", hints={@QueryHint(name="org.hibernate.cacheMode", value="REFRESH")})

    それに応じて、他のモードも試すことができます。

  • Ehcache ドキュメント :

    Session.find は、プライマリ オブジェクトのキャッシュを使用しません。Hibernate は、関連付けられたオブジェクトに対してキャッシュを使用しようとします。ただし、Session.find によってキャッシュが作成されます。Query.find はまったく同じように機能します。これらは、キャッシュ ヒットの可能性が低い場合に使用します。

于 2012-05-08T12:00:35.190 に答える
1

更新後に em1.flush() を使用してみてください:)

于 2012-05-08T09:48:45.703 に答える