]
Steve Ebersole closed HHH-6880.
-------------------------------
Resolution: Incomplete
Fix Version/s: (was: 4.0.1)
Actually, I missed the fact that {{SessionFactoryImpl}} additionally implements
{{#readResolve}}.
What is (most likely) missing in your code is naming the {{SessionFactory}}. The linked
issue simply allows that to happen without that name having to be a JNDI name. Just name
your {{SessionFactory}}. If you do not want this published into JNDI, then disable the
new setting discussed on HHH-6822
Implementations of org.hibernate.type.Type contain references to
non-serializable entities
------------------------------------------------------------------------------------------
Key: HHH-6880
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-6880
Project: Hibernate Core
Issue Type: Bug
Components: core
Affects Versions: 3.6.7
Environment: Seen this on MySQL but I believe this is environment-agnostic
Reporter: Mindaugas Žakšauskas
Assignee: Steve Ebersole
Priority: Critical
Labels: serialization
Time Spent: 59m
This is a spin-off from
-
https://forum.hibernate.org/viewtopic.php?f=1&t=1013687&sid=e62b8...
-
http://stackoverflow.com/q/8404559/7345
org.hibernate.cache.CacheKey is an object which is used for L2 cache notifications - e.g.
to flush a cache on a different cluster node when a certain object has been updated.
The problem comes from org.hibernate.cache.CacheKey carrying the type which (sometimes)
happens to have a reference to objects like org.hibernate.impl.SessionFactoryImpl.
This problem is actually not just theoretic but also causes real pain. First, it takes
much longer to broadcast cache flush events. Secondly, I get this exception during
deserialization of such a CacheKey:
java.lang.NullPointerException
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768)
at
org.hibernate.impl.SessionFactoryObjectFactory.getNamedInstance(SessionFactoryObjectFactory.java:159)
at org.hibernate.impl.SessionFactoryImpl.readResolve(SessionFactoryImpl.java:753)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeReadResolve(ObjectStreamClass.java:1061)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1762)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readUnshared(ObjectInputStream.java:441)
at my.class.deserializeKey(EhcacheUtils.java:35)
I have done a quick scan through all the types, and found these problems related to their
serializability:
1) org.hibernate.type.CollectionType, org.hibernate.type.ComponentType and subclasses of
both - they use attribute "typeScope" (of type TypeFactory.TypeScope) which is
assigned in the constructor and kept in the but seems to be never used. The typeScope in
turn has a reference to the SessionImpl. Can it simply be removed?
2) org.hibernate.type.EntityType (and its subclasses) stores typeScope and only uses it
in the getter, so I guess it should be safe to remove it, too.
3) org.hibernate.type.SortedSetType and org.hibernate.type.SortedMapType keeps a
reference to the comparator, but does not enforce its serializability. It should at least
throw a runtime exception in org.hibernate.mapping.Collection::getComparator if the
comparator is not serializable.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: