2017-05-02 7 views
1

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は常にキャッシュからエンティティを取得しようとしますが、グラフの一部である属性がキャッシュ内にあるのかどうかを考慮しません。この機能は基本的に無駄です道を下って。両方の命令の間でエンティティマネージャをクリア

+0

私は同じ問題に直面しています。どんな発見? –

答えて

0

は私のために働くようだ:

Tool tool = toolRepository.findOne(id); 
em.clear(); 
Tool toolEg = toolRepository.findOne(id, CustomEntityGraph.fromAttributes(new String[] { "system", "manufacturer" }, EntityGraphType.LOAD)); 

欠点はドキュメントを約#clear()を告げるものです:

クリア永続コンテキストにすべての管理対象エンティティを引き起こし分離される。データベースにフラッシュされていないエンティティに対する変更は永続化されません。

私は#detach(tool)で試しましたが動作しません。

+0

はい、この特定の問題を解決しても、永続性全体をクリアすることは解決策ではありません。この動作が設計であるかどうかはわかりませんが、これによってエンティティグラフ全体が完全に役に立たなくなります。 – mfc

+0

@mfc:私は同じと思う:) –

関連する問題