オブジェクトの更新時にHibernateの第2レベルのキャッシュキーを複製しようとすると、奇妙なケースを発見しました。Hibernateレプリケーションの問題 - セッションを本当に複製する必要がありますか?
キャッシュキー構造は、このようなものです:私はここで見ることができます
cacheKey = {org.hibernate.cache.CacheKey}
|- key = {my.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
問題はcacheKey.type.typeScope
が終わっ複製されますローカルo.h.i.SessionFactoryImpl
への参照を持っているということです。 typeScope
(またはその祖先の1つ)は、一時的なものとして宣言されませんか?
クラスを見ると、このクラスではtypeScope
属性はまったく使用されていませんが、コンストラクタで設定され、保持されていることがわかります。これはHibernateのバグですか?
注:o.h.t.ComponentType
は、エンティティが複合キーを持ち、そのエンティティに特殊な識別子オブジェクトを使用する場合に使用されます。
私たちは、Hibernate v3.6.7とEhcache v2.4.4を使用します。これもHibernate Users forumに掲載されています。
編集: HHH-6880を開きました。
私はEhcache users mailing listにも同様のメッセージを投稿しています。Alex @ Terracottaはこれが本物の問題だと示唆しました。バージョン3.6でHHH-5182によって導入された可能性があります。 hibernate-dev threadへのリンクがあります。