[hibernate-issues] [Hibernate-JIRA] Commented: (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
[ https://hibernate.onjira.com/browse/HHH-7180?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=45974#comment-45974 ]
Steve Ash commented on HHH-7180:
--------------------------------
Looks like this ProxyVisitor hasn't changed in a while, so I would expect this problem to still exist in 4.0+
https://source.jboss.org/browse/~br=trunk/Hibernate/core/trunk/core/src/main/java/org/hibernate/event/def/ProxyVisitor.java?hb=true
> 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