2

次の問題があります。私はJBoss5.1、JPA/Hibernateと2次キャッシュを使用しています。私のシステムには、同じデータベーステーブルをマッピングするエンティティがほとんどありません。例:テーブルFURNITURESは、エンティティ「Furn」および「Furniture」によってマップされます。

これらのクラスは変更できません。

これで、ID 1の「Furn」のデータを変更すると、ID1の「Furniture」にはまだ古いデータが残っています。「Furn」が更新された後、「Furniture」を削除する可能性はありますか?

4

2 に答える 2

3

オブジェクトを更新/削除すると、それらの変更を反映するためにキャッシュレイヤーに通知が送信されます。

キャッシュキーは別のサーバーにブロードキャストされる可能性があるため、リモートエンドが関連するエントリをフラッシュするのに十分な情報を提供するのに十分なペイロードを伝送する必要があります。ただし、一方で、スループットを最大化するために大きすぎることはできません。

デバッグをオンにすると、次の構造が表示されます(永続オブジェクトのタイプ、識別子-複合かどうかなどによって異なる場合があります)。

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パスはよりクリーンです。

于 2012-10-29T23:12:53.783 に答える
2

同じテーブルを2つのエンティティにマッピングすることはお勧めしません。そのため、hibernateがこれを自動的に処理するとは思いません。

Furnエンティティのフラッシュ後リスナーを実装してから、次のコードのようなものを使用して、対応するFurnitureオブジェクトを削除できます。

// This creates a proxy if not already loaded 
// other gives the object
Furniture furniture = session.load(Furniture.class,furn.getId());
// remove from first level cache
session.evict(furniture);
// remove from second level cache
sessionFactory.evict(Furniture.class,furn.getId());
于 2012-10-29T15:48:11.410 に答える