Ho scoperto un caso strano durante il tentativo di replicare una chiave di cache di secondo livello Hibernate all'aggiornamento dell'oggetto.Problemi di replica in ibernazione: la sessione deve davvero essere replicata?
La cache struttura chiave è così:
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
Il problema che possiamo vedere qui è che cacheKey.type.typeScope
ha un riferimento locale o.h.i.SessionFactoryImpl
che viene replicato sopra. Dovrebbe typeScope
(o uno dei suoi antenati) non essere dichiarato come transitorio?
Guardando la classe o.h.t.ComponentType
, posso vedere che l'attributo typeScope
non viene utilizzato affatto in questa classe ma è impostato solo nel costruttore e tenuto in. È un errore Hibernate?
NOTA: o.h.t.ComponentType
viene utilizzato quando l'entità ha una chiave composita e usa oggetto identificatore speciale per questo.
Utilizziamo Hibernate v3.6.7 e Ehcache v2.4.4. Questo è stato anche pubblicato su Hibernate Users forum.
EDIT: ho aperto HHH-6880, senza molto successo finora.
Ho anche inviato un messaggio simile allo Ehcache users mailing list e Alex @ Terracotta ha suggerito che si trattava di un problema reale, probabilmente introdotto da HHH-5182 nella versione 3.6 e che riguardava anche cose come la serializzazione di Ehcache su disco. Ecco un collegamento a hibernate-dev thread.