カスケード削除の対象となるアイテムのコレクションに対して、Hibernate が第 2 レベルのキャッシュを更新しないという問題があります。
詳細
Child オブジェクトの Parent.myChildren コレクションを持つオブジェクト Parent があるとします。これで、Humans.myAllHumans コレクションを持つオブジェクト Humans もあり、すべての親オブジェクトと子オブジェクトはそのコレクション内にあります。
これで、session.delete(parent)が実行され、すべての子がデータベースからカスケード削除されますが、Humans.myAllHumans コレクションのキャッシュは更新されません! カスケード削除されたオブジェクトがデータベースにあると想定し、後でコレクションを反復しようとすると、次の例外が発生します:
org.hibernate.ObjectNotFoundException: 指定された識別子を持つ行が存在しません: [foo.Child#751]
試みたアプローチ
1)私はSessionFactory.evictCollection()アプローチを試しましたが、トランザクションセーフではなく、第 2 レベルのキャッシュからデータをハード削除することを理解しているので、それは望ましくありません。
2) myAllHumans コレクションから各オブジェクトを手動で (プログラムで) 削除することもできます。この場合、休止状態は第 2 レベルのキャッシュを更新します。このアプローチは、カスケード削除機能が役に立たなくなるだけなので、避けたいと思います。
期待される
コレクションのキャッシュを自動的に更新できるように、休止状態を賢くしたいと思います。出来ますか?
私は現在 EhCache を使用しています。別のキャッシュ実装を使用するか、EhCache を構成すると役立つと思いますか?