9

カスケード削除の対象となるアイテムのコレクションに対して、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 を構成すると役立つと思いますか?

4

3 に答える 3

1

キャッシュからコレクションを削除する必要がある他の問題に苦労していて、いくつかの解決策を考え出しました。カスケード削除時にコレクションのキャッシュを自動的に更新できるかどうかはわかりませんが、SessionFactory.evictCollection()を試し、それが機能した場合、このソリューションはトランザクションに対して安全であり、次のようにも機能すると思います。

if (MYCOLLECTION instanceof AbstractPersistentCollection) ((AbstractPersistentCollection) MYCOLLECTION).dirty();

于 2010-05-19T21:35:25.253 に答える
1

問題は、Hibernate が実際に削除を行わないことです。データベースは外部キー関係の一部としてこれを行うため、Hibernate は削除される可能性のあるすべてのオブジェクトを確認することはありません。したがって、すべての場合に機能するキャッシュを更新する方法はありません。

最善の策は、削除時にキャッシュ (またはその一部) をフラッシュすることだと思います。

于 2009-09-24T10:56:40.210 に答える
0

通常、Hibernateは、caheをリロードするために、政治的に誤ったオブジェクトの更新を必要とします。

重要なことは、EhCacheがレイジープロパティをどのように処理するかです。コレクションのlazy属性が設定されておらず、caheがオブジェクトを更新しないことがわかりました。

あなたの場合、humanity属性のHumansセットがlazy = true(デフォルトオプション)に設定されている場合、オブジェクトの場合、ehcacheはそれを更新しません。人間と子供のコレクションの怠惰な属性をfalseに設定してみてください。

于 2009-12-03T19:39:05.567 に答える