I haven't spent a ton of time looking into this yet but while trying to 
update uPortal to use naturalIds in 4.1.1 I think I ran into a bug in: 
NaturalIdXrefDelegate$NaturalIdResolutionCache.areSame(Object[], Object[])

That code uses Type.compare(Object x, Object y) to compare each pair of 
fields in the two naturalIds.

I have an entity that has a field of type Class which ends up using the 
org.hibernate.type.ClassType.
ClassType relies on parent class AbstractStandardBasicType to implement 
the compare method.
AbstractStandardBasicType uses the JavaTypeDescriptor.getComparator() 
method to get the comparator to use.
For ClassType the JavaTypeDescriptor is 
org.hibernate.type.descriptor.java.ClassTypeDescriptor which never sets 
a comparator so JavaTypeDescriptor.getComparator() returns null 
resulting in the following NPE:

Caused by: java.lang.NullPointerException
     at 
org.hibernate.type.AbstractStandardBasicType.compare(AbstractStandardBasicType.java:210)
     at 
org.hibernate.engine.internal.NaturalIdXrefDelegate$NaturalIdResolutionCache.areSame(NaturalIdXrefDelegate.java:353)
     at 
org.hibernate.engine.internal.NaturalIdXrefDelegate$NaturalIdResolutionCache.cache(NaturalIdXrefDelegate.java:338)
     at 
org.hibernate.engine.internal.NaturalIdXrefDelegate.cacheNaturalIdResolution(NaturalIdXrefDelegate.java:78)
     at 
org.hibernate.engine.internal.StatefulPersistenceContext.entityStateUpdatedNotification(StatefulPersistenceContext.java:1732)
     at 
org.hibernate.engine.spi.EntityEntry.notifyLoadedStateUpdated(EntityEntry.java:382)
     at 
org.hibernate.engine.spi.EntityEntry.postUpdate(EntityEntry.java:244)
     at 
org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:152)
     at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
     at 
org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
     at 
org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:276)
     at 
org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
     at 
org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
     at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1127)
     at 
org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:325)
     at 
org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
     at 
org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
     at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:73)

I likely won't have time to try and reproduce this in a hibernate unit 
test until Monday or Tuesday, I'm hoping someone might have a quick insight.

-Eric
_______________________________________________
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev

Reply via email to