[hibernate-issues] [Hibernate-JIRA] Created: (HHH-7180) Reattaching a collection whose owner uses a primitive array primary key fails with "reassociated object has dirty collection reference"

Steve Ash (JIRA) noreply at atlassian.com
Thu Mar 15 12:55:48 EDT 2012


Reattaching a collection whose owner uses a primitive array primary key fails with "reassociated object has dirty collection reference"
---------------------------------------------------------------------------------------------------------------------------------------

                 Key: HHH-7180
                 URL: https://hibernate.onjira.com/browse/HHH-7180
             Project: Hibernate ORM
          Issue Type: Bug
          Components: core
         Environment: Hibernate 3.6.4
MSSQL 2008
            Reporter: Steve Ash


We have a Parent class with @Id of type byte[] and a Child class also with @Id of type byte[].  There is a bidirectional @OneToMany relationship "List<Child> getChildren()" in Parent with Cascade.ALL and FetchType.EAGER.

We load a parent (eagerly loading its children) and detach this instance from the session.  We later want to re-attach the parent + children insteances by using the Lock API with LockMode.NONE.

This fails with:
{panel}
org.hibernate.HibernateException: reassociated object has dirty collection reference
	at org.hibernate.event.def.OnLockVisitor.processCollection(OnLockVisitor.java:71)
	at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:122)
	at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:83)
	at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:77)
	at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:144)
	at org.hibernate.event.def.AbstractReassociateEventListener.reassociate(AbstractReassociateEventListener.java:101)
	at org.hibernate.event.def.DefaultLockEventListener.onLock(DefaultLockEventListener.java:82)
	at org.hibernate.impl.SessionImpl.fireLock(SessionImpl.java:774)
	at org.hibernate.impl.SessionImpl.fireLock(SessionImpl.java:766)
	at org.hibernate.impl.SessionImpl.access$600(SessionImpl.java:156)
	at org.hibernate.impl.SessionImpl$LockRequestImpl.lock(SessionImpl.java:2369)
	at com.argodata.fser.data.BlockManTest.testSimpleUpdate(BlockManTest.java:160)
{panel}

The problem is that {{ProxyVisitor}}'s {{isOwnerUnchanged}} uses id.equals( snapshot.getKey() ) to validate the the PersistentCollections snapshot owner id value is "equal" to the current id.  For primitve keys like long and int this works, but for byte[] keys it fails as its a reference equals operation, not a value equals.  If we switch our id type to long then we can re-attach the parent and children with the lock API as expected.

Workaround is simple of course, just don't use array types for @Ids or wrap them with something that implements equals properly.  However, considering that I believe primary arrays as keys are handled properly in other places, so I would guess that this is just an inconistency and that it should work as expected in ProxyVisitor as well.

I will attach a TestCase replicating the problem shortly.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list