With embedded crowd, we're getting the following errors in our logs. It appears that Crowd uses the hibernate query cache, but not all query keys are serializable, resulting in errors.
@400000004f0d17962735970c 2012-01-10 23:01:00,657 org.hibernate.cache.StandardQueryCache.data ERROR [store.compound.factories.DiskStorageFactory] Disk Write of sql: select this_.id as id6_1_, this_.parent_id as parent2_6_1_, this_.child_id as child3_6_1_, this_.me
mbership_type as membership4_6_1_, this_.group_type as group5_6_1_, this_.parent_name as parent6_6_1_, this_.lower_parent_name as lower7_6_1_, this_.child_name as child8_6_1_, this_.lower_child_name as lower9_6_1_, this_.directory_id as directory10_6_1_, directory
i2_.id as id7_0_, directoryi2_.directory_name as directory2_7_0_, directoryi2_.lower_directory_name as lower3_7_0_, directoryi2_.created_date as created4_7_0_, directoryi2_.updated_date as updated5_7_0_, directoryi2_.active as active7_0_, directoryi2_.description
as descript7_7_0_, directoryi2_.impl_class as impl8_7_0_, directoryi2_.lower_impl_class as lower9_7_0_, directoryi2_.directory_type as directory10_7_0_ from cwd_membership this_ inner join cwd_directory directoryi2_ on this_.directory_id=directoryi2_.id where this
.directory_id=? and this.lower_parent_name=? and this_.lower_child_name=? and this_.membership_type=?; parameters: 32769, hal-staging-access, clover, GROUP_USER, ; transformer: org.hibernate.transform.RootEntityResultTransformer@16eaa9e failed (it will be evicte
d instead):
@400000004f0d179627363734 java.io.NotSerializableException: com.atlassian.crowd.util.persistence.hibernate.GenericEnumUserType
@400000004f0d179627363b1c at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
@400000004f0d179627363f04 at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
@400000004f0d17962736528c at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
@400000004f0d179627365a5c at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
@400000004f0d179627365e44 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
@400000004f0d17962736622c at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346)
@400000004f0d1796273671cc at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154)
@400000004f0d1796273675b4 at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
@400000004f0d179627367d84 at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
@400000004f0d1796273698dc at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
@400000004f0d179627369cc4 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
@400000004f0d17962736a0ac at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
@400000004f0d17962736a494 at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:422)
@400000004f0d17962736b81c at net.sf.ehcache.Element.writeObject(Element.java:791)
@400000004f0d17962736bc04 at sun.reflect.GeneratedMethodAccessor245.invoke(Unknown Source)
@400000004f0d17962736bfec at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
@400000004f0d17962736c3d4 at java.lang.reflect.Method.invoke(Method.java:597)
@400000004f0d17962736c7bc at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
@400000004f0d17962736db44 at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
@400000004f0d17962736df2c at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
@400000004f0d17962736e314 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
@400000004f0d17962736e6fc at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
@400000004f0d17962736eae4 at net.sf.ehcache.util.MemoryEfficientByteArrayOutputStream.serialize(MemoryEfficientByteArrayOutputStream.java:97)
@400000004f0d179627372d4c at net.sf.ehcache.store.compound.factories.DiskStorageFactory.serializeElement(DiskStorageFactory.java:332)
@400000004f0d17962737351c at net.sf.ehcache.store.compound.factories.DiskStorageFactory.write(DiskStorageFactory.java:311)
@400000004f0d179627373904 at net.sf.ehcache.store.compound.factories.DiskStorageFactory$DiskWriteTask.call(DiskStorageFactory.java:415)
@400000004f0d179627374c8c at net.sf.ehcache.store.compound.factories.DiskOverflowStorageFactory$OverflowDiskWriteTask.call(DiskOverflowStorageFactory.java:295)
@400000004f0d17962737545c at net.sf.ehcache.store.compound.factories.DiskOverflowStorageFactory$OverflowDiskWriteTask.call(DiskOverflowStorageFactory.java:284)
@400000004f0d17962737c98c at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
@400000004f0d17962737e4e4 at java.util.concurrent.FutureTask.run(FutureTask.java:138)
@400000004f0d17962737e8cc at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)
@400000004f0d17962737f09c at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)
@400000004f0d1796273813c4 at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
@400000004f0d1796273817ac at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
@400000004f0d179627381f7c at java.lang.Thread.run(Thread.java:662)
Out of all fields on this class:
I think we will need to store the following fields as String
And do reflection when required, a little worried about serialising these two values, all other fields on the GenericEnumUserType look fine.