Я обнаружил странный случай, когда пытался реплицировать ключ кэша 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
(или один из его предков) не должен быть объявлен переходным?
Глядя на класс o.h.t.ComponentType
, я вижу, что атрибут typeScope
вообще не используется в этом классе, а только устанавливается в конструкторе и сохраняется в нем. Это ошибка Hibernate?
ПРИМЕЧАНИЕ: o.h.t.ComponentType
используется, когда у сущности есть составной ключ и для него используется специальный идентификатор объекта.
Мы используем Hibernate v3.6.7 и Ehcache v2.4.4. Это также было размещено на форуме пользователей Hibernate .
EDIT:
Я открыл ЧЧХ-6880 , но пока без особого успеха.
Я также опубликовал аналогичное сообщение в списке рассылки пользователей Ehcache , и Алекс @ Терракота предположил, что это подлинная проблема, вероятно, появившаяся в HHH-5182 в версии 3.6 и также затрагивающая такие вещи, как сериализация Ehcache диск. Вот ссылка на тему hibernate-dev .