EntityGraphsを使用する場合、JPAレベル1キャッシュはどのように機能しますか?JPA/Hibernate EntityGraphとキャッシュ
私が呼び出す場合:
Tool tool = toolRepository.findOne(id, CustomEntityGraph.fromAttributes(new String[] { "system", "manufacturer" }, EntityGraphType.LOAD));
(私はところでここに春のデータを使用していますし、これは私のカスタムリポジトリからの方法であるが、それが問題のために、関連はありません)。
これは、システムと製造者テーブルに必要なすべてのJOINを含む適切なSELECTステートメントでデータベースにヒットします。これは完璧に正常に動作しています。
しかし、私はこれを呼び出す場合:
Tool tool = toolRepository.findOne(id);
Tool toolEg = toolRepository.findOne(id, CustomEntityGraph.fromAttributes(new String[] { "system", "manufacturer" }, EntityGraphType.LOAD));
を最初findOneコールがOKであるのみツールテーブルにSELECTでデータベースをヒットしますが、2番目のfindOneは、データベースにヒットしませんとつかむだろうキャッシュからのツールエンティティ。これは大きな問題です。なぜなら、キャッシュされたエンティティにはシステムや製造元がロードされていないからです。エンティティグラフにアクセスしようとすると、遅れてロードされます。
これは起こりそうですか?ツールエンティティはすでにキャッシュされていても、EntityGraphはキャッシュされていない他の2つのテーブルからエンティティをフェッチするように指定しているため、2回目の呼び出しで再度データベースにヒットすることを期待していました。 EntityGraphは常にキャッシュからエンティティを取得しようとしますが、グラフの一部である属性がキャッシュ内にあるのかどうかを考慮しません。この機能は基本的に無駄です道を下って。両方の命令の間でエンティティマネージャをクリア
私は同じ問題に直面しています。どんな発見? –