Author: gbadner
Date: 2010-08-20 13:18:44 -0400 (Fri, 20 Aug 2010)
New Revision: 20210
Modified:
core/trunk/core/src/main/java/org/hibernate/event/def/AbstractSaveEventListener.java
core/trunk/testsuite/src/test/java/org/hibernate/test/cascade/CascadeTestWithAssignedParentIdTest.java
Log:
HHH-3334 : Cascade-save breaks if parent ID is assigned (delays insert) and child has
identity ID (early insert) (Wallace Wadge)
Modified:
core/trunk/core/src/main/java/org/hibernate/event/def/AbstractSaveEventListener.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/event/def/AbstractSaveEventListener.java 2010-08-20
13:34:56 UTC (rev 20209)
+++
core/trunk/core/src/main/java/org/hibernate/event/def/AbstractSaveEventListener.java 2010-08-20
17:18:44 UTC (rev 20210)
@@ -262,11 +262,6 @@
boolean inTxn = source.getJDBCContext().isTransactionInProgress();
boolean shouldDelayIdentityInserts = !inTxn && !requiresImmediateIdAccess;
- if ( useIdentityColumn && !shouldDelayIdentityInserts ) {
- log.trace( "executing insertions" );
- source.getActionQueue().executeInserts();
- }
-
// Put a placeholder in entries, so we don't recurse back and try to save() the
// same object again. QUESTION: should this be done before onSave() is called?
// likewise, should it be done before onUpdate()?
@@ -286,6 +281,11 @@
cascadeBeforeSave( source, persister, entity, anything );
+ if ( useIdentityColumn && !shouldDelayIdentityInserts ) {
+ log.trace( "executing insertions" );
+ source.getActionQueue().executeInserts();
+ }
+
Object[] values = persister.getPropertyValuesToInsert( entity, getMergeMap( anything ),
source );
Type[] types = persister.getPropertyTypes();
Modified:
core/trunk/testsuite/src/test/java/org/hibernate/test/cascade/CascadeTestWithAssignedParentIdTest.java
===================================================================
---
core/trunk/testsuite/src/test/java/org/hibernate/test/cascade/CascadeTestWithAssignedParentIdTest.java 2010-08-20
13:34:56 UTC (rev 20209)
+++
core/trunk/testsuite/src/test/java/org/hibernate/test/cascade/CascadeTestWithAssignedParentIdTest.java 2010-08-20
17:18:44 UTC (rev 20210)
@@ -59,44 +59,7 @@
return new FunctionalTestClassTestSuite( CascadeTestWithAssignedParentIdTest.class );
}
-
- /**
- * Saves the child object with the parent when both the one-to-many and
- * many-to-one associations use cascade="all"
- */
- public void testSaveChildWithParentFailureExpected() {
- if ( ! IdentityGenerator.class.isAssignableFrom(
getDialect().getNativeIdentifierGeneratorClass() ) ) {
- reportSkip( "FailureExpected test passes when native id generator is not
IdentityGenerator",
- "parent insert is assigned (delayed) when child is identity (early
insert)" );
- fail( "test is expected to fail" );
- return;
- }
- Session session = openSession();
- Transaction txn = session.beginTransaction();
- Parent parent = new Parent();
- Child child = new Child();
- child.setParent( parent );
- parent.setChildren( Collections.singleton( child ) );
- parent.setId(new Long(123L));
- // this should figure out that the parent needs saving first since id is assigned.
- session.save( child );
- txn.commit();
- session.close();
-
- session = openSession();
- txn = session.beginTransaction();
- parent = ( Parent ) session.get( Parent.class, parent.getId() );
- assertEquals( 1, parent.getChildren().size() );
- txn.commit();
- session.close();
- }
-
public void testSaveChildWithParent() {
- if ( IdentityGenerator.class.isAssignableFrom(
getDialect().getNativeIdentifierGeneratorClass() ) ) {
- reportSkip( "test is known to fail when native id generator is
IdentityGenerator",
- "parent insert is assigned (delayed) when child has identity (early
insert)" );
- return;
- }
Session session = openSession();
Transaction txn = session.beginTransaction();
Parent parent = new Parent();