環境
名称 | バージョン |
---|---|
Spring Boot | 3.1.5 |
SpringDataJPA | 3.1.5 |
Hibernate | 6.2.13 |
MySQL | 8.0.34 |
問題
Serviceクラスから、findAll(Specification, Sort)を、Specificationの内容を変えて2回呼び出したら、2回目の戻り値に1回目の取得結果が混ざってしまった。
例えば、
1回目:where item_name='りんご'
で抽出
1回目の戻り値:item_nameが「りんご」のエンティティのリスト
2回目:where item_name='バナナ'
で抽出
2回目の戻り値:item_nameが「りんご」と「バナナ」のエンティティのリスト
…といった具合。(実際には条件によって半端にマージされたりされなかったり)
DBの実行SQLログは、想定通りの結果を出すSQLを実行している。
AP側で何かしら処理をしているんだろうとは思ったものの、何故そうなるかわからなかった。
Serviceクラスには、クラスに対して@Transactional(readOnly = true)
を指定している。
解決方法
ServiceでEntityManager#clear()した。
後書き
Entityに@Cacheable(value = false)
を付けるだけでは動作しなかった。
あと、何かが根本的に間違ってる気がする。。DB操作する度にキャッシュクリアするもんなのかあ…?
参考