From: <hib...@li...> - 2006-03-08 05:18:14
|
Author: ste...@jb... Date: 2006-03-08 00:18:12 -0500 (Wed, 08 Mar 2006) New Revision: 9576 Modified: trunk/Hibernate3/src/org/hibernate/action/EntityDeleteAction.java trunk/Hibernate3/src/org/hibernate/action/EntityUpdateAction.java trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java Log: HHH-1546 : generated version properties and multiple queued actions Modified: trunk/Hibernate3/src/org/hibernate/action/EntityDeleteAction.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/action/EntityDeleteAction.java 2006-03-08 05:17:04 UTC (rev 9575) +++ trunk/Hibernate3/src/org/hibernate/action/EntityDeleteAction.java 2006-03-08 05:18:12 UTC (rev 9576) @@ -24,14 +24,14 @@ private final boolean isCascadeDeleteEnabled; private final Object[] state; - public EntityDeleteAction(final Serializable id, - final Object[] state, - final Object version, - final Object instance, - final EntityPersister persister, - final boolean isCascadeDeleteEnabled, - final SessionImplementor session) { - + public EntityDeleteAction( + final Serializable id, + final Object[] state, + final Object version, + final Object instance, + final EntityPersister persister, + final boolean isCascadeDeleteEnabled, + final SessionImplementor session) { super( session, id, instance, persister ); this.version = version; this.isCascadeDeleteEnabled = isCascadeDeleteEnabled; @@ -45,7 +45,15 @@ Object instance = getInstance(); boolean veto = preDelete(); - + + Object version = this.version; + if ( persister.isVersionPropertyGenerated() ) { + // we need to grab the version value from the entity, otherwise + // we have issues with generated-version entities that may have + // multiple actions queued during the same flush + version = persister.getVersion( instance, session.getEntityMode() ); + } + final CacheKey ck; if ( persister.hasCache() ) { ck = new CacheKey( Modified: trunk/Hibernate3/src/org/hibernate/action/EntityUpdateAction.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/action/EntityUpdateAction.java 2006-03-08 05:17:04 UTC (rev 9575) +++ trunk/Hibernate3/src/org/hibernate/action/EntityUpdateAction.java 2006-03-08 05:18:12 UTC (rev 9576) @@ -64,6 +64,13 @@ boolean veto = preUpdate(); final SessionFactoryImplementor factory = getSession().getFactory(); + Object previousVersion = this.previousVersion; + if ( persister.isVersionPropertyGenerated() ) { + // we need to grab the version value from the entity, otherwise + // we have issues with generated-version entities that may have + // multiple actions queued during the same flush + previousVersion = persister.getVersion( instance, session.getEntityMode() ); + } final CacheKey ck; if ( persister.hasCache() ) { @@ -100,8 +107,8 @@ throw new AssertionFailure( "possible nonthreadsafe access to session" ); } - if ( entry.getStatus()==Status.MANAGED ) { - + if ( entry.getStatus()==Status.MANAGED || persister.isVersionPropertyGenerated() ) { + // get the updated snapshot by cloning current state // it is safe to copy in place, since by this time // no-one else has a reference to the array Modified: trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-03-08 05:17:04 UTC (rev 9575) +++ trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-03-08 05:18:12 UTC (rev 9576) @@ -3540,7 +3540,7 @@ public void processUpdateGeneratedProperties(Serializable id, Object entity, Object[] state, SessionImplementor session) { if ( !hasInsertGeneratedProperties() ) { - throw new AssertionFailure("no insert-generated properties"); + throw new AssertionFailure("no update-generated properties"); } processGeneratedProperties( id, entity, state, session, sqlUpdateGeneratedValuesSelectString, getPropertyUpdateGeneration() ); } |