オブジェクトを更新/削除すると、それらの変更を反映するためにキャッシュレイヤーに通知が送信されます。
キャッシュキーは別のサーバーにブロードキャストされる可能性があるため、リモートエンドが関連するエントリをフラッシュするのに十分な情報を提供するのに十分なペイロードを伝送する必要があります。ただし、一方で、スループットを最大化するために大きすぎることはできません。
デバッグをオンにすると、次の構造が表示されます(永続オブジェクトのタイプ、識別子-複合かどうかなどによって異なる場合があります)。
cacheKey = {org.hibernate.cache.CacheKey}
|- key = {your.own.serializable.class}
|- type = {org.hibernate.type.ComponentType}
| |- typeScope = {org.hibernate.type.TypeFactory$TypeScopeImpl}
| | |- factory = {org.hibernate.impl.SessionFactoryImpl}
| |- propertyNames = {...}
| |- propertyTypes = {...}
| |- propertyNullability = {...}
| |- propertySpan = 2
| |- cascade = {...}
| |- joinedFetch = {...}
| |- isKey = true
| |- tuplizerMapping = {...}
|- entityOrRoleName = {java.lang.String} "my.Entity"
|- entityMode = {org.hibernate.EntityMode}
|- hashCode = 588688
ご覧のとおり、Hibernateキャッシュキーには、クラス名、IDタイプなどに関する情報が格納されます。2つの異なるタイプがある場合、それらは2つの異なるキャッシュキーにマップされるため、問題が発生します。
これを修正するために、両方のエンティティのDAOクラスを作成し、それらのエンティティを永続化するためのすべての呼び出しがそれらを通過するだけで、他の場所を通過しないようにすることができます。次に、両方のエントリのupdate
/delete
メソッドで、他のエンティティをロードして削除します。
別のオプションは、同じ機能を実現するのに役立つインターセプターを使用することですが、私の好みでは、DAOパスはよりクリーンです。