[hibernate-commits] Hibernate SVN: r14363 - in core/trunk: core/src/main/java/org/hibernate/engine and 7 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Feb 25 16:06:19 EST 2008


Author: gbadner
Date: 2008-02-25 16:06:19 -0500 (Mon, 25 Feb 2008)
New Revision: 14363

Added:
   core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/Entity.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassCollectionEventTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassMapping.hbm.xml
   core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToManySubclass.java
Modified:
   core/trunk/core/src/main/java/org/hibernate/action/CollectionRecreateAction.java
   core/trunk/core/src/main/java/org/hibernate/action/CollectionRemoveAction.java
   core/trunk/core/src/main/java/org/hibernate/action/CollectionUpdateAction.java
   core/trunk/core/src/main/java/org/hibernate/engine/PersistenceContext.java
   core/trunk/core/src/main/java/org/hibernate/engine/StatefulPersistenceContext.java
   core/trunk/core/src/main/java/org/hibernate/event/AbstractCollectionEvent.java
   core/trunk/core/src/main/java/org/hibernate/event/InitializeCollectionEvent.java
   core/trunk/core/src/main/java/org/hibernate/event/PostCollectionRecreateEvent.java
   core/trunk/core/src/main/java/org/hibernate/event/PostCollectionRemoveEvent.java
   core/trunk/core/src/main/java/org/hibernate/event/PostCollectionUpdateEvent.java
   core/trunk/core/src/main/java/org/hibernate/event/PreCollectionRecreateEvent.java
   core/trunk/core/src/main/java/org/hibernate/event/PreCollectionRemoveEvent.java
   core/trunk/core/src/main/java/org/hibernate/event/PreCollectionUpdateEvent.java
   core/trunk/core/src/main/java/org/hibernate/type/CollectionType.java
   core/trunk/core/src/main/resources/org/hibernate/hibernate-configuration-3.0.dtd
   core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/AbstractCollectionEventTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/BrokenCollectionEventTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/Child.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/ChildEntity.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/ChildValue.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/ParentWithCollection.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/AbstractAssociationCollectionEventTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ChildWithBidirectionalManyToMany.java
Log:
HHH-2616 : added owner ID and name getters to collection events; added partial support for property-refs; added Javadoc


Modified: core/trunk/core/src/main/java/org/hibernate/action/CollectionRecreateAction.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/action/CollectionRecreateAction.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/action/CollectionRecreateAction.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -53,7 +53,7 @@
 				.getPreCollectionRecreateEventListeners();
 		if (preListeners.length > 0) {
 			PreCollectionRecreateEvent preEvent = new PreCollectionRecreateEvent(
-					getCollection(), ( EventSource ) getSession() );
+					getPersister(), getCollection(), ( EventSource ) getSession() );
 			for ( int i = 0; i < preListeners.length; i++ ) {
 				preListeners[i].onPreRecreateCollection( preEvent );
 			}
@@ -65,7 +65,7 @@
 				.getPostCollectionRecreateEventListeners();
 		if (postListeners.length > 0) {
 			PostCollectionRecreateEvent postEvent = new PostCollectionRecreateEvent(
-					getCollection(), ( EventSource ) getSession() );
+					getPersister(), getCollection(), ( EventSource ) getSession() );
 			for ( int i = 0; i < postListeners.length; i++ ) {
 				postListeners[i].onPostRecreateCollection( postEvent );
 			}

Modified: core/trunk/core/src/main/java/org/hibernate/action/CollectionRemoveAction.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/action/CollectionRemoveAction.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/action/CollectionRemoveAction.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -45,7 +45,7 @@
 		// the loaded owner will be set to null after the collection is removed,
 		// so capture its value as the affected owner so it is accessible to
 		// both pre- and post- events
-		this.affectedOwner = session.getPersistenceContext().getLoadedCollectionOwner( collection );
+		this.affectedOwner = session.getPersistenceContext().getLoadedCollectionOwnerOrNull( collection );
 	}
 
 	/**
@@ -68,7 +68,7 @@
 				final SessionImplementor session)
 			throws CacheException {
 		super( persister, null, id, session );
-		if (affectedOwner == null) { throw new AssertionFailure("affectedOwner == null"); };
+		if (affectedOwner == null) { throw new AssertionFailure("affectedOwner == null"); }
 		this.emptySnapshot = emptySnapshot;
 		this.affectedOwner = affectedOwner;
 	}
@@ -106,9 +106,7 @@
 				.getPreCollectionRemoveEventListeners();
 		if (preListeners.length>0) {
 			PreCollectionRemoveEvent preEvent = new PreCollectionRemoveEvent(
-					getCollection(),
-					affectedOwner,
-					( EventSource )getSession() );
+					getPersister(), getCollection(), ( EventSource ) getSession(), affectedOwner );
 			for ( int i = 0; i < preListeners.length; i++ ) {
 				preListeners[i].onPreRemoveCollection(preEvent);
 			}
@@ -120,9 +118,7 @@
 				.getPostCollectionRemoveEventListeners();
 		if (postListeners.length>0) {
 			PostCollectionRemoveEvent postEvent = new PostCollectionRemoveEvent(
-					getCollection(),
-					affectedOwner,
-					( EventSource )getSession() );
+					getPersister(), getCollection(), ( EventSource ) getSession(), affectedOwner );
 			for ( int i = 0; i < postListeners.length; i++ ) {
 				postListeners[i].onPostRemoveCollection(postEvent);
 			}

Modified: core/trunk/core/src/main/java/org/hibernate/action/CollectionUpdateAction.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/action/CollectionUpdateAction.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/action/CollectionUpdateAction.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -82,7 +82,7 @@
 				.getPreCollectionUpdateEventListeners();
 		if (preListeners.length > 0) {
 			PreCollectionUpdateEvent preEvent = new PreCollectionUpdateEvent(
-					getCollection(), ( EventSource ) getSession() );
+					getPersister(), getCollection(), ( EventSource ) getSession() );
 			for ( int i = 0; i < preListeners.length; i++ ) {
 				preListeners[i].onPreUpdateCollection( preEvent );
 			}
@@ -94,7 +94,7 @@
 				.getPostCollectionUpdateEventListeners();
 		if (postListeners.length > 0) {
 			PostCollectionUpdateEvent postEvent = new PostCollectionUpdateEvent(
-					getCollection(), ( EventSource ) getSession() );
+					getPersister(), getCollection(), ( EventSource ) getSession() );
 			for ( int i = 0; i < postListeners.length; i++ ) {
 				postListeners[i].onPostUpdateCollection( postEvent );
 			}

Modified: core/trunk/core/src/main/java/org/hibernate/engine/PersistenceContext.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/engine/PersistenceContext.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/engine/PersistenceContext.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -1,4 +1,4 @@
-//$Id: PersistenceContext.java 11319 2007-03-20 03:12:56Z steve.ebersole at jboss.com $
+//$Id: PersistenceContext.java 14312 2008-02-05 23:55:35Z gbadner $
 package org.hibernate.engine;
 
 import java.io.Serializable;
@@ -22,7 +22,7 @@
 public interface PersistenceContext {
 	
 	public boolean isStateless();
-	
+
 	/**
 	 * Get the session to which this persistence context is bound.
 	 *
@@ -89,7 +89,7 @@
 	 * corresponding row.
 	 */
 	public Object[] getNaturalIdSnapshot(Serializable id, EntityPersister persister)
-			throws HibernateException;
+	throws HibernateException;
 
 	/**
 	 * Add a canonical mapping from entity key to entity instance
@@ -252,10 +252,22 @@
 
 	/**
 	 * Get the entity that owned this persistent collection when it was loaded
+	 *
+	 * @param collection The persistent collection
+	 * @return the owner if its entity ID is available from the collection's loaded key
+	 * and the owner entity is in the persistence context; otherwise, returns null
 	 */
-	Object getLoadedCollectionOwner(PersistentCollection collection);
+	Object getLoadedCollectionOwnerOrNull(PersistentCollection collection);
 
 	/**
+	 * Get the ID for the entity that owned this persistent collection when it was loaded
+	 *
+	 * @param collection The persistent collection
+	 * @return the owner ID if available from the collection's loaded key; otherwise, returns null
+	 */
+	public Serializable getLoadedCollectionOwnerIdOrNull(PersistentCollection collection);
+
+	/**
 	 * add a collection we just loaded up (still needs initializing)
 	 */
 	public void addUninitializedCollection(CollectionPersister persister,

Modified: core/trunk/core/src/main/java/org/hibernate/engine/StatefulPersistenceContext.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/engine/StatefulPersistenceContext.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/engine/StatefulPersistenceContext.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -680,13 +680,49 @@
 
 	/**
 	 * Get the entity that owned this persistent collection when it was loaded
+	 *
+	 * @param collection The persistent collection
+	 * @return the owner, if its entity ID is available from the collection's loaded key
+	 * and the owner entity is in the persistence context; otherwise, returns null
 	 */
-	public Object getLoadedCollectionOwner(PersistentCollection collection) {
-		CollectionEntry ce = getCollectionEntry(collection);
-		if ( ce.getLoadedKey() == null || ce.getLoadedPersister() == null ) {
+	public Object getLoadedCollectionOwnerOrNull(PersistentCollection collection) {
+		CollectionEntry ce = getCollectionEntry( collection );
+		if ( ce.getLoadedPersister() == null ) {
+			return null; // early exit...
+		}
+		Object loadedOwner = null;
+		// TODO: an alternative is to check if the owner has changed; if it hasn't then
+		// return collection.getOwner()
+		Serializable entityId = getLoadedCollectionOwnerIdOrNull( ce );
+		if ( entityId != null ) {
+			loadedOwner = getCollectionOwner( entityId, ce.getLoadedPersister() );
+		}
+		return loadedOwner;
+	}
+
+	/**
+	 * Get the ID for the entity that owned this persistent collection when it was loaded
+	 *
+	 * @param collection The persistent collection
+	 * @return the owner ID if available from the collection's loaded key; otherwise, returns null
+	 */
+	public Serializable getLoadedCollectionOwnerIdOrNull(PersistentCollection collection) {
+		return getLoadedCollectionOwnerIdOrNull( getCollectionEntry( collection ) );
+	}
+
+	/**
+	 * Get the ID for the entity that owned this persistent collection when it was loaded
+	 *
+	 * @param ce The collection entry
+	 * @return the owner ID if available from the collection's loaded key; otherwise, returns null
+	 */
+	private Serializable getLoadedCollectionOwnerIdOrNull(CollectionEntry ce) {
+		if ( ce == null || ce.getLoadedKey() == null || ce.getLoadedPersister() == null ) {
 			return null;
 		}
-		return getCollectionOwner(ce.getLoadedKey(), ce.getLoadedPersister());
+		// TODO: an alternative is to check if the owner has changed; if it hasn't then
+		// get the ID from collection.getOwner()
+		return ce.getLoadedPersister().getCollectionType().getIdOfOwnerOrNull( ce.getLoadedKey(), session );
 	}
 
 	/**

Modified: core/trunk/core/src/main/java/org/hibernate/event/AbstractCollectionEvent.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/AbstractCollectionEvent.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/event/AbstractCollectionEvent.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -1,32 +1,12 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-
 //$Id: $
 package org.hibernate.event;
 
+import java.io.Serializable;
+
 import org.hibernate.collection.PersistentCollection;
-import org.hibernate.engine.SessionImplementor;
+import org.hibernate.engine.CollectionEntry;
+import org.hibernate.engine.EntityEntry;
+import org.hibernate.persister.collection.CollectionPersister;
 
 /**
  * Defines a base class for events involving collections.
@@ -37,22 +17,99 @@
 
 	private final PersistentCollection collection;
 	private final Object affectedOwner;
+	private final Serializable affectedOwnerId;
+	private final String affectedOwnerEntityName;
 
-	public AbstractCollectionEvent(PersistentCollection collection, EventSource source, Object affectedOwner) {
+	/**
+	 * Constructs an AbstractCollectionEvent object.
+	 *
+	 * @param collection - the collection
+	 * @param source - the Session source
+	 * @param affectedOwner - the owner that is affected by this event;
+	 * can be null if unavailable
+	 * @param affectedOwnerId - the ID for the owner that is affected
+	 * by this event; can be null if unavailable
+	 * that is affected by this event; can be null if unavailable
+	 */
+	public AbstractCollectionEvent( CollectionPersister collectionPersister,
+					PersistentCollection collection,
+					EventSource source,
+					Object affectedOwner,
+					Serializable affectedOwnerId) {
 		super(source);
 		this.collection = collection;
 		this.affectedOwner = affectedOwner;
+		this.affectedOwnerId = affectedOwnerId;
+		this.affectedOwnerEntityName =
+				getAffectedOwnerEntityName( collectionPersister, affectedOwner, source );
 	}
 
-	protected static Object getLoadedOwner( PersistentCollection collection, EventSource source ) {
-		return ( ( SessionImplementor ) source ).getPersistenceContext().getLoadedCollectionOwner( collection );
+	protected static CollectionPersister getLoadedCollectionPersister( PersistentCollection collection, EventSource source ) {
+		CollectionEntry ce = source.getPersistenceContext().getCollectionEntry( collection );
+		return ( ce == null ? null : ce.getLoadedPersister() );		
 	}
 
+	protected static Object getLoadedOwnerOrNull( PersistentCollection collection, EventSource source ) {
+		return source.getPersistenceContext().getLoadedCollectionOwnerOrNull( collection );
+	}
+
+	protected static Serializable getLoadedOwnerIdOrNull( PersistentCollection collection, EventSource source ) {
+		return source.getPersistenceContext().getLoadedCollectionOwnerIdOrNull( collection );
+	}
+
+	protected static Serializable getOwnerIdOrNull( Object owner, EventSource source ) {
+		EntityEntry ownerEntry = source.getPersistenceContext().getEntry( owner );
+		return ( ownerEntry == null ? null : ownerEntry.getId() );
+	}
+
+	protected static String getAffectedOwnerEntityName(CollectionPersister collectionPersister, Object affectedOwner, EventSource source ) {
+
+		// collectionPersister should not be null, but we don't want to throw
+		// an exception if it is null
+		String entityName =
+				( collectionPersister == null ? null : collectionPersister.getOwnerEntityPersister().getEntityName() );
+		if ( affectedOwner != null ) {
+			EntityEntry ee = source.getPersistenceContext().getEntry( affectedOwner );
+			if ( ee != null && ee.getEntityName() != null) {
+				entityName = ee.getEntityName();
+			}
+		}	
+		return entityName;
+	}
+
 	public PersistentCollection getCollection() {
 		return collection;
 	}
 
-	public Object getAffectedOwner() {
+	/**
+	 * Get the collection owner entity that is affected by this event.
+	 *
+	 * @return the affected owner; returns null if the entity is not in the persistence context
+	 * (e.g., because the collection from a detached entity was moved to a new owner)
+	 */
+	public Object getAffectedOwnerOrNull() {
 		return affectedOwner;
 	}
+
+	/**
+	 * Get the ID for the collection owner entity that is affected by this event.
+	 *
+	 * @return the affected owner ID; returns null if the ID cannot be obtained
+	 * from the collection's loaded key (e.g., a property-ref is used for the
+	 * collection and does not include the entity's ID)
+	 */
+	public Serializable getAffectedOwnerIdOrNull() {
+		return affectedOwnerId;
+	}
+
+	/**
+	 * Get the entity name for the collection owner entity that is affected by this event.
+	 *
+	 * @return the entity name; if the owner is not in the PersistenceContext, the
+	 * returned value may be a superclass name, instead of the actual class name
+	 */
+	public String getAffectedOwnerEntityName() {
+		return affectedOwnerEntityName;
+	}
+
 }

Modified: core/trunk/core/src/main/java/org/hibernate/event/InitializeCollectionEvent.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/InitializeCollectionEvent.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/event/InitializeCollectionEvent.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -1,4 +1,4 @@
-//$Id: InitializeCollectionEvent.java 6929 2005-05-27 03:54:08Z oneovthafew $
+//$Id: InitializeCollectionEvent.java 14313 2008-02-06 07:46:52Z gbadner $
 package org.hibernate.event;
 
 import org.hibernate.collection.PersistentCollection;
@@ -11,7 +11,11 @@
  */
 public class InitializeCollectionEvent extends AbstractCollectionEvent {
 
-	public InitializeCollectionEvent(PersistentCollection collection, EventSource source) {
-		super(collection, source, getLoadedOwner( collection, source ) );
-	}	
+	public InitializeCollectionEvent(PersistentCollection collection, EventSource source ) {
+		super( getLoadedCollectionPersister( collection, source ),
+				collection,
+				source,
+				getLoadedOwnerOrNull( collection, source ),
+				getLoadedOwnerIdOrNull( collection, source ) );
+	}
 }

Modified: core/trunk/core/src/main/java/org/hibernate/event/PostCollectionRecreateEvent.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/PostCollectionRecreateEvent.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/event/PostCollectionRecreateEvent.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -2,6 +2,7 @@
 package org.hibernate.event;
 
 import org.hibernate.collection.PersistentCollection;
+import org.hibernate.persister.collection.CollectionPersister;
 
 /**
  * An event that occurs after a collection is recreated
@@ -10,7 +11,11 @@
  */
 public class PostCollectionRecreateEvent extends AbstractCollectionEvent {
 
-	public PostCollectionRecreateEvent(PersistentCollection collection, EventSource source) {
-		super(collection, source, collection.getOwner());
+	public PostCollectionRecreateEvent( CollectionPersister collectionPersister,
+										PersistentCollection collection,
+										EventSource source ) {
+		super( collectionPersister, collection, source,
+				collection.getOwner(),
+				getOwnerIdOrNull( collection.getOwner(), source ) );
 	}
 }

Modified: core/trunk/core/src/main/java/org/hibernate/event/PostCollectionRemoveEvent.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/PostCollectionRemoveEvent.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/event/PostCollectionRemoveEvent.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -2,6 +2,7 @@
 package org.hibernate.event;
 
 import org.hibernate.collection.PersistentCollection;
+import org.hibernate.persister.collection.CollectionPersister;
 
 /**
  * An event that occurs after a collection is removed
@@ -10,7 +11,12 @@
  */
 public class PostCollectionRemoveEvent extends AbstractCollectionEvent {
 
-	public PostCollectionRemoveEvent(PersistentCollection collection, Object loadedOwner, EventSource source) {
-		super(collection, source, loadedOwner);
+	public PostCollectionRemoveEvent(CollectionPersister collectionPersister,
+									 PersistentCollection collection,
+									 EventSource source,
+									 Object loadedOwner ) {
+		super( collectionPersister, collection, source,
+				loadedOwner,
+				getOwnerIdOrNull( loadedOwner, source ) );
 	}
 }

Modified: core/trunk/core/src/main/java/org/hibernate/event/PostCollectionUpdateEvent.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/PostCollectionUpdateEvent.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/event/PostCollectionUpdateEvent.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -2,6 +2,7 @@
 package org.hibernate.event;
 
 import org.hibernate.collection.PersistentCollection;
+import org.hibernate.persister.collection.CollectionPersister;
 
 /**
  * An event that occurs after a collection is updated
@@ -10,7 +11,11 @@
  */
 public class PostCollectionUpdateEvent extends AbstractCollectionEvent {
 
-	public PostCollectionUpdateEvent(PersistentCollection collection, EventSource source) {
-		super(collection, source, getLoadedOwner( collection, source ));
+	public PostCollectionUpdateEvent(CollectionPersister collectionPersister,
+									 PersistentCollection collection,
+									 EventSource source) {
+		super( collectionPersister, collection, source,
+				getLoadedOwnerOrNull( collection, source ),
+				getLoadedOwnerIdOrNull( collection, source ) );
 	}
 }

Modified: core/trunk/core/src/main/java/org/hibernate/event/PreCollectionRecreateEvent.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/PreCollectionRecreateEvent.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/event/PreCollectionRecreateEvent.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -2,6 +2,7 @@
 package org.hibernate.event;
 
 import org.hibernate.collection.PersistentCollection;
+import org.hibernate.persister.collection.CollectionPersister;
 
 /**
  * An event that occurs before a collection is recreated
@@ -10,7 +11,11 @@
  */
 public class PreCollectionRecreateEvent extends AbstractCollectionEvent {
 
-	public PreCollectionRecreateEvent(PersistentCollection collection, EventSource source) {
-		super(collection, source, collection.getOwner());
+	public PreCollectionRecreateEvent(CollectionPersister collectionPersister,
+									  PersistentCollection collection,
+									  EventSource source) {
+		super( collectionPersister, collection, source,
+				collection.getOwner(),
+				getOwnerIdOrNull( collection.getOwner(), source ) );
 	}
 }

Modified: core/trunk/core/src/main/java/org/hibernate/event/PreCollectionRemoveEvent.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/PreCollectionRemoveEvent.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/event/PreCollectionRemoveEvent.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -1,31 +1,8 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-
 //$Id: $
 package org.hibernate.event;
 
 import org.hibernate.collection.PersistentCollection;
+import org.hibernate.persister.collection.CollectionPersister;
 
 /**
  * An event that occurs before a collection is removed
@@ -34,7 +11,12 @@
  */
 public class PreCollectionRemoveEvent extends AbstractCollectionEvent {
 
-	public PreCollectionRemoveEvent(PersistentCollection collection, Object loadedOwner, EventSource source) {
-		super(collection, source, loadedOwner);
+	public PreCollectionRemoveEvent(CollectionPersister collectionPersister,
+									PersistentCollection collection,
+									EventSource source,
+									Object loadedOwner) {
+		super( collectionPersister, collection, source,
+				loadedOwner,
+				getOwnerIdOrNull( loadedOwner, source ) );
 	}
 }

Modified: core/trunk/core/src/main/java/org/hibernate/event/PreCollectionUpdateEvent.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/PreCollectionUpdateEvent.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/event/PreCollectionUpdateEvent.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -2,6 +2,7 @@
 package org.hibernate.event;
 
 import org.hibernate.collection.PersistentCollection;
+import org.hibernate.persister.collection.CollectionPersister;
 
 /**
  * An event that occurs before a collection is updated
@@ -10,7 +11,11 @@
  */
 public class PreCollectionUpdateEvent extends AbstractCollectionEvent {
 
-	public PreCollectionUpdateEvent(PersistentCollection collection, EventSource source) {
-		super(collection, source, getLoadedOwner( collection, source ));
+	public PreCollectionUpdateEvent(CollectionPersister collectionPersister,
+									PersistentCollection collection,
+									EventSource source) {
+		super( collectionPersister, collection, source,
+				getLoadedOwnerOrNull( collection, source ),
+				getLoadedOwnerIdOrNull( collection, source ) );
 	}
 }

Modified: core/trunk/core/src/main/java/org/hibernate/type/CollectionType.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/type/CollectionType.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/java/org/hibernate/type/CollectionType.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -13,6 +13,7 @@
 
 import org.dom4j.Element;
 import org.dom4j.Node;
+
 import org.hibernate.EntityMode;
 import org.hibernate.Hibernate;
 import org.hibernate.HibernateException;
@@ -26,6 +27,7 @@
 import org.hibernate.engine.SessionImplementor;
 import org.hibernate.persister.collection.CollectionPersister;
 import org.hibernate.persister.collection.QueryableCollection;
+import org.hibernate.persister.entity.EntityPersister;
 import org.hibernate.persister.entity.Joinable;
 import org.hibernate.proxy.HibernateProxy;
 import org.hibernate.proxy.LazyInitializer;
@@ -260,6 +262,13 @@
 		return getPersister( session ).getOwnerEntityPersister().isVersioned();
 	}
 
+	/**
+	 * Get our underlying collection persister (using the session to access the
+	 * factory).
+	 *
+	 * @param session The session from which the request is originating.
+	 * @return The underlying collection persister
+	 */
 	private CollectionPersister getPersister(SessionImplementor session) {
 		return session.getFactory().getCollectionPersister( role );
 	}
@@ -335,6 +344,7 @@
 			}
 
 			// NOTE VERY HACKISH WORKAROUND!!
+			// TODO: Fix this so it will work for non-POJO entity mode
 			Type keyType = getPersister( session ).getKeyType();
 			if ( !keyType.getReturnedClass().isInstance( id ) ) {
 				id = (Serializable) keyType.semiResolve(
@@ -348,6 +358,37 @@
 		}
 	}
 
+	/**
+	 * Get the id value from the owning entity key, usually the same as the key, but might be some
+	 * other property, in the case of property-ref
+	 *
+	 * @param key The collection owner key
+	 * @param session The session from which the request is originating.
+	 * @return The collection owner's id, if it can be obtained from the key;
+	 * otherwise, null is returned
+	 */
+	public Serializable getIdOfOwnerOrNull(Serializable key, SessionImplementor session) {
+		Serializable ownerId = null;
+		if ( foreignKeyPropertyName == null ) {
+			ownerId = key;
+		}
+		else {
+			Type keyType = getPersister( session ).getKeyType();
+			EntityPersister ownerPersister = getPersister( session ).getOwnerEntityPersister();
+			// TODO: Fix this so it will work for non-POJO entity mode
+			Class ownerMappedClass = ownerPersister.getMappedClass( session.getEntityMode() );
+			if ( ownerMappedClass.isAssignableFrom( keyType.getReturnedClass() ) &&
+					keyType.getReturnedClass().isInstance( key ) ) {
+				// the key is the owning entity itself, so get the ID from the key
+				ownerId = ownerPersister.getIdentifier( key, session.getEntityMode() );
+			}
+			else {
+				// TODO: check if key contains the owner ID
+			}
+		}
+		return ownerId;
+	}
+
 	public Object hydrate(ResultSet rs, String[] name, SessionImplementor session, Object owner) {
 		// can't just return null here, since that would
 		// cause an owning component to become null

Modified: core/trunk/core/src/main/resources/org/hibernate/hibernate-configuration-3.0.dtd
===================================================================
--- core/trunk/core/src/main/resources/org/hibernate/hibernate-configuration-3.0.dtd	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/core/src/main/resources/org/hibernate/hibernate-configuration-3.0.dtd	2008-02-25 21:06:19 UTC (rev 14363)
@@ -34,10 +34,10 @@
 <!ATTLIST collection-cache usage (read-only|read-write|nonstrict-read-write|transactional) #REQUIRED>
 
 <!ELEMENT event (listener*)>
-<!ATTLIST event type (auto-flush|merge|create|create-onflush|delete|dirty-check|evict|flush|flush-entity|load|load-collection|lock|refresh|replicate|save-update|save|update|pre-load|pre-update|pre-insert|pre-delete|post-load|post-update|post-insert|post-delete|post-commit-update|post-commit-insert|post-commit-delete) #REQUIRED>
+<!ATTLIST event type (auto-flush|merge|create|create-onflush|delete|dirty-check|evict|flush|flush-entity|load|load-collection|lock|refresh|replicate|save-update|save|update|pre-load|pre-update|pre-insert|pre-delete|pre-collection-recreate|pre-collection-remove|pre-collection-update|post-load|post-update|post-insert|post-delete|post-collection-recreate|post-collection-remove|post-collection-update|post-commit-update|post-commit-insert|post-commit-delete) #REQUIRED>
 
 <!ELEMENT listener EMPTY>
-<!ATTLIST listener type (auto-flush|merge|create|create-onflush|delete|dirty-check|evict|flush|flush-entity|load|load-collection|lock|refresh|replicate|save-update|save|update|pre-load|pre-update|pre-insert|pre-delete|post-load|post-update|post-insert|post-delete|post-commit-update|post-commit-insert|post-commit-delete) #IMPLIED>
+<!ATTLIST listener type (auto-flush|merge|create|create-onflush|delete|dirty-check|evict|flush|flush-entity|load|load-collection|lock|refresh|replicate|save-update|save|update|pre-load|pre-update|pre-insert|pre-delete|pre-collection-recreate|pre-collection-remove|pre-collection-update|post-load|post-update|post-insert|post-delete|post-collection-recreate|post-collection-remove|post-collection-update|post-commit-update|post-commit-insert|post-commit-delete) #IMPLIED>
 <!ATTLIST listener class CDATA #REQUIRED>
 
 <!ELEMENT session-factory (property*, mapping*, (class-cache|collection-cache)*, event*, listener*)>

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/AbstractCollectionEventTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/AbstractCollectionEventTest.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/AbstractCollectionEventTest.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -94,9 +94,9 @@
 		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
 		Child child = ( Child ) parent.getChildren().iterator().next();
-		if ( child.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionRecreateListener(), child, index++ );
-			checkResult( listeners, listeners.getPostCollectionRecreateListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
 		}
 		checkNumberOfResults( listeners, index );
 	}
@@ -119,9 +119,9 @@
 		}
 		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
-		if ( newChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionRecreateListener(), newChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionRecreateListener(), newChild, index++ );
+		if ( newChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
 		}
 		checkNumberOfResults( listeners, index );
 	}
@@ -143,9 +143,9 @@
 		}
 		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
-		if ( newChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionRecreateListener(), newChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionRecreateListener(), newChild, index++ );
+		if ( newChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
 		}
 		checkNumberOfResults( listeners, index );
 	}
@@ -167,9 +167,9 @@
 		}
 		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
-		if ( newChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionRecreateListener(), newChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionRecreateListener(), newChild, index++ );
+		if ( newChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
 		}
 		checkNumberOfResults( listeners, index );
 	}
@@ -183,8 +183,8 @@
 		Session s = openSession();
 		Transaction tx = s.beginTransaction();
 		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
-		if ( child instanceof ChildEntity ) {
-			child = ( Child ) s.get( child.getClass(), ( ( ChildEntity ) child ).getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child ).getId() );
 		}
 		parent.addChild( child );
 		tx.commit();
@@ -193,16 +193,20 @@
 		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
 			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
 		}
-		if ( child.hasBidirectionalManyToMany() && ( ( PersistentCollection ) getParents( child ) ).wasInitialized() ) {
-				checkResult( listeners, listeners.getInitializeCollectionListener(), child, index++ );
+		ChildWithBidirectionalManyToMany childWithManyToMany = null;
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			childWithManyToMany = ( ChildWithBidirectionalManyToMany ) child;
+			if ( ( ( PersistentCollection ) childWithManyToMany.getParents() ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), childWithManyToMany, index++ );
+			}
 		}
 		if ( !( parent.getChildren() instanceof PersistentSet ) ) {
 			checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
 			checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
 		}
-		if ( child.hasBidirectionalManyToMany() && !( getParents( child ) instanceof PersistentSet ) ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), child, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), child, index++ );
+		if ( childWithManyToMany != null && !( childWithManyToMany.getParents() instanceof PersistentSet ) ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), childWithManyToMany, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), childWithManyToMany, index++ );
 		}
 		checkNumberOfResults( listeners, index );
 	}
@@ -226,9 +230,9 @@
 		}
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, collectionOrig, index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, collectionOrig, index++ );
-		if ( newChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionRecreateListener(), newChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionRecreateListener(), newChild, index++ );
+		if ( newChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
 		}
 		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
@@ -254,9 +258,9 @@
 		}
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
-		if ( newChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionRecreateListener(), newChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionRecreateListener(), newChild, index++ );
+		if ( newChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
 		}
 		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
@@ -272,8 +276,8 @@
 		Session s = openSession();
 		Transaction tx = s.beginTransaction();
 		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
-		if ( child instanceof ChildEntity ) {
-			child = ( ChildEntity ) s.get( child.getClass(), ( ( ChildEntity ) child).getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child).getId() );
 		}
 		Collection oldCollection = parent.getChildren();
 		parent.newChildren( createCollection() );
@@ -284,16 +288,19 @@
 		if ( ( ( PersistentCollection ) oldCollection ).wasInitialized() ) {
 			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, oldCollection, index++ );
 		}
-		if ( child.hasBidirectionalManyToMany()  && ( ( PersistentCollection ) getParents( child ) ).wasInitialized() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			ChildWithBidirectionalManyToMany childWithManyToMany = ( ChildWithBidirectionalManyToMany ) child;
+			if ( ( ( PersistentCollection ) childWithManyToMany.getParents() ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), childWithManyToMany, index++ );
+			}
 		}
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
-		if ( child.hasBidirectionalManyToMany() ) {
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
 			// hmmm, the same parent was removed and re-added to the child's collection;
 			// should this be considered an update?
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), child, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), child, index++ );
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
 		}
 		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
@@ -309,8 +316,8 @@
 		Session s = openSession();
 		Transaction tx = s.beginTransaction();
 		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
-		if ( oldChild instanceof ChildEntity ) {
-			oldChild = ( ChildEntity ) s.get( oldChild.getClass(), ( ( ChildEntity ) oldChild).getId() );
+		if ( oldChild instanceof Entity ) {
+			oldChild = ( Child ) s.get( oldChild.getClass(), ( ( Entity ) oldChild).getId() );
 		}
 		Collection oldCollection = parent.getChildren();
 		parent.newChildren( createCollection() );
@@ -321,16 +328,19 @@
 		if ( ( ( PersistentCollection ) oldCollection ).wasInitialized() ) {
 			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, oldCollection, index++ );
 		}
-		if ( oldChild.hasBidirectionalManyToMany() && ( ( PersistentCollection ) getParents( oldChild ) ).wasInitialized() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), oldChild, index++ );
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			ChildWithBidirectionalManyToMany oldChildWithManyToMany = ( ChildWithBidirectionalManyToMany ) oldChild;
+			if ( ( ( PersistentCollection ) oldChildWithManyToMany.getParents() ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), oldChildWithManyToMany, index++ );
+			}
 		}
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
-		if ( oldChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), oldChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), oldChild, index++ );
-			checkResult( listeners, listeners.getPreCollectionRecreateListener(), newChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionRecreateListener(), newChild, index++ );
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) oldChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) oldChild, index++ );
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
 		}
 		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
@@ -346,8 +356,8 @@
 		Session s = openSession();
 		Transaction tx = s.beginTransaction();
 		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
-		if ( child instanceof ChildEntity ) {
-			child = ( Child ) s.get( child.getClass(), ( ( ChildEntity ) child ).getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child ).getId() );
 		}
 		parent.removeChild( child );
 		tx.commit();
@@ -356,14 +366,17 @@
 		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
 			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
 		}
-		if ( child.hasBidirectionalManyToMany() && ( ( PersistentCollection ) getParents( child ) ).wasInitialized() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			ChildWithBidirectionalManyToMany childWithManyToMany = ( ChildWithBidirectionalManyToMany ) child;
+			if ( ( ( PersistentCollection ) childWithManyToMany.getParents( ) ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), childWithManyToMany, index++ );
+			}
 		}
 		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
-		if ( child.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), child, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
 		}
 		checkNumberOfResults( listeners, index );
 	}
@@ -377,8 +390,8 @@
 		Session s = openSession();
 		Transaction tx = s.beginTransaction();
 		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
-		if ( child instanceof ChildEntity ) {
-			child = ( Child ) s.get( child.getClass(), ( ( ChildEntity ) child ).getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child ).getId() );
 		}
 		parent.clearChildren();
 		tx.commit();
@@ -387,14 +400,17 @@
 		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
 			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
 		}
-		if ( child.hasBidirectionalManyToMany() && ( ( PersistentCollection ) getParents( child ) ).wasInitialized() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			ChildWithBidirectionalManyToMany childWithManyToMany = ( ChildWithBidirectionalManyToMany ) child;
+			if ( ( ( PersistentCollection ) childWithManyToMany.getParents() ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), childWithManyToMany, index++ );
+			}
 		}
 		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
-		if ( child.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), child, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
 		}
 		checkNumberOfResults( listeners, index );
 	}
@@ -415,8 +431,8 @@
 		s = openSession();
 		tx = s.beginTransaction();
 		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
-		if ( oldChild instanceof ChildEntity ) {
-			oldChild = ( Child ) s.get( oldChild.getClass(), ( ( ChildEntity ) oldChild ).getId() );
+		if ( oldChild instanceof Entity ) {
+			oldChild = ( Child ) s.get( oldChild.getClass(), ( ( Entity ) oldChild ).getId() );
 		}
 		parent.removeChild( oldChild );
 		tx.commit();
@@ -425,14 +441,17 @@
 		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
 			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
 		}
-		if ( oldChild.hasBidirectionalManyToMany() && ( ( PersistentCollection ) getParents( oldChild ) ).wasInitialized() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), oldChild, index++ );
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			ChildWithBidirectionalManyToMany oldChildWithManyToMany = ( ChildWithBidirectionalManyToMany ) oldChild;
+			if ( ( ( PersistentCollection ) oldChildWithManyToMany.getParents() ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), oldChildWithManyToMany, index++ );
+			}
 		}
 		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
-		if ( oldChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), oldChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), oldChild, index++ );
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) oldChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) oldChild, index++ );
 		}
 		checkNumberOfResults( listeners, index );
 	}
@@ -479,11 +498,11 @@
 		Session s = openSession();
 		Transaction tx = s.beginTransaction();
 		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
-		if ( child instanceof ChildEntity ) {
-			child = ( Child ) s.get( child.getClass(), ( ( ChildEntity ) child ).getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child ).getId() );
 		}
 		parent.removeChild( child );
-		if ( child instanceof ChildEntity ) {
+		if ( child instanceof Entity ) {
 			s.delete( child );
 		}
 		s.delete( parent );
@@ -491,14 +510,14 @@
 		s.close();
 		int index = 0;
 		checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
-		if ( child.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
 		}
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, index++ );
-		if ( child.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionRemoveListener(), child, index++ );
-			checkResult( listeners, listeners.getPostCollectionRemoveListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRemoveListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionRemoveListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
 		}
 		checkNumberOfResults( listeners, index );
 	}
@@ -513,8 +532,8 @@
 		Transaction tx = s.beginTransaction();
 		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
 		otherParent = ( ParentWithCollection ) s.get( otherParent.getClass(), otherParent.getId() );
-		if ( child instanceof ChildEntity ) {
-			child = ( Child ) s.get( child.getClass(), ( ( ChildEntity ) child ).getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child ).getId() );
 		}
 		parent.removeChild( child );
 		otherParent.addChild( child );
@@ -524,8 +543,8 @@
 		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
 			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
 		}
-		if ( child.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
 		}
 		if ( ( ( PersistentCollection ) otherParent.getChildren() ).wasInitialized() ) {
 			checkResult( listeners, listeners.getInitializeCollectionListener(), otherParent, index++ );
@@ -534,9 +553,9 @@
 		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPreCollectionUpdateListener(), otherParent, index++ );
 		checkResult( listeners, listeners.getPostCollectionUpdateListener(), otherParent, index++ );
-		if ( child.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), child, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
 		}
 		checkNumberOfResults( listeners, index );
 	}
@@ -551,8 +570,8 @@
 		Transaction tx = s.beginTransaction();
 		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
 		otherParent = ( ParentWithCollection ) s.get( otherParent.getClass(), otherParent.getId() );
-		if ( child instanceof ChildEntity ) {
-			child = ( ChildEntity ) s.get( child.getClass(), ( ( ChildEntity ) child ).getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child ).getId() );
 		}
 		otherParent.addAllChildren( parent.getChildren() );
 		parent.clearChildren();
@@ -565,16 +584,16 @@
 		if ( ( ( PersistentCollection ) otherParent.getChildren() ).wasInitialized() ) {
 			checkResult( listeners, listeners.getInitializeCollectionListener(), otherParent, index++ );
 		}
-		if ( child.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
 		}
 		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
 		checkResult( listeners, listeners.getPreCollectionUpdateListener(), otherParent, index++ );
 		checkResult( listeners, listeners.getPostCollectionUpdateListener(), otherParent, index++ );
-		if ( child.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), child, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
 		}
 		checkNumberOfResults( listeners, index );
 	}
@@ -598,24 +617,24 @@
 		if ( ( ( PersistentCollection ) otherCollectionOrig ).wasInitialized() ) {
 			checkResult( listeners, listeners.getInitializeCollectionListener(), otherParent, otherCollectionOrig, index++ );
 			otherChildOrig = ( Child ) otherCollectionOrig.iterator().next();
-			if ( otherChildOrig.hasBidirectionalManyToMany() ) {
-				checkResult( listeners, listeners.getInitializeCollectionListener(), otherChildOrig, index++ );
+			if ( otherChildOrig instanceof ChildWithBidirectionalManyToMany ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) otherChildOrig, index++ );
 			}
 		}
 		checkResult( listeners, listeners.getInitializeCollectionListener(), parent, otherParent.getChildren(), index++ );
 		Child otherChild = ( Child ) otherParent.getChildren().iterator().next();
-		if ( otherChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), otherChild, index++ );
+		if ( otherChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) otherChild, index++ );
 		}
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, otherParent.getChildren(), index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, otherParent.getChildren(), index++ );
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), otherParent, otherCollectionOrig, index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), otherParent, otherCollectionOrig, index++ );
-		if ( otherChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), otherChildOrig, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), otherChildOrig, index++ );
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), otherChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), otherChild, index++ );
+		if ( otherChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherChildOrig, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherChildOrig, index++ );
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherChild, index++ );
 		}
 		checkResult( listeners, listeners.getPreCollectionRecreateListener(), otherParent, index++ );
 		checkResult( listeners, listeners.getPostCollectionRecreateListener(), otherParent, index++ );
@@ -649,24 +668,24 @@
 		if ( ( ( PersistentCollection ) otherCollectionOrig ).wasInitialized() ) {
 			checkResult( listeners, listeners.getInitializeCollectionListener(), otherParent, otherCollectionOrig, index++ );
 			otherChildOrig = ( Child ) otherCollectionOrig.iterator().next();
-			if ( otherChildOrig.hasBidirectionalManyToMany() ) {
-				checkResult( listeners, listeners.getInitializeCollectionListener(), otherChildOrig, index++ );
+			if ( otherChildOrig instanceof ChildWithBidirectionalManyToMany ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) otherChildOrig, index++ );
 			}
 		}
 		checkResult( listeners, listeners.getInitializeCollectionListener(), parent, otherOtherParent.getChildren(), index++ );
 		Child otherOtherChild = ( Child ) otherOtherParent.getChildren().iterator().next();
-		if ( otherOtherChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), otherOtherChild, index++ );
+		if ( otherOtherChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) otherOtherChild, index++ );
 		}
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, otherOtherParent.getChildren(), index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, otherOtherParent.getChildren(), index++ );
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), otherParent, otherCollectionOrig, index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), otherParent, otherCollectionOrig, index++ );
-		if ( otherOtherChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), otherChildOrig, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), otherChildOrig, index++ );
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), otherOtherChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), otherOtherChild, index++ );
+		if ( otherOtherChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherChildOrig, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherChildOrig, index++ );
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherOtherChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherOtherChild, index++ );
 		}
 		checkResult( listeners, listeners.getPreCollectionRecreateListener(), otherParent, otherOtherParent.getChildren(), index++ );
 		checkResult( listeners, listeners.getPostCollectionRecreateListener(), otherParent, otherOtherParent.getChildren(), index++ );
@@ -677,9 +696,9 @@
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), otherParent, otherOtherParent.getChildren(), index++ );
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), otherOtherParent, otherOtherCollectionOrig, index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), otherOtherParent, otherOtherCollectionOrig, index++ );
-		if ( otherOtherChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), otherOtherChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), otherOtherChild, index++ );
+		if ( otherOtherChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherOtherChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherOtherChild, index++ );
 		}
 		checkResult( listeners, listeners.getPreCollectionRecreateListener(), otherOtherParent, index++ );
 		checkResult( listeners, listeners.getPostCollectionRecreateListener(), otherOtherParent, index++ );
@@ -721,11 +740,6 @@
 		return parent;
 	}
 
-	protected Collection getParents( Child child ) {
-		return ( ( child instanceof ChildWithBidirectionalManyToMany )
-						? ( ( ChildWithBidirectionalManyToMany ) child ).getParents()
-						: null );
-	}
 	protected void checkResult(CollectionListeners listeners,
 							 CollectionListeners.Listener listenerExpected,
 							 ParentWithCollection parent,
@@ -734,21 +748,29 @@
 	}
 	protected void checkResult(CollectionListeners listeners,
 							 CollectionListeners.Listener listenerExpected,
-							 Child child,
+							 ChildWithBidirectionalManyToMany child,
 							 int index) {
-		checkResult( listeners, listenerExpected, child, getParents( child ), index );
+		checkResult( listeners, listenerExpected, child, child.getParents(), index );
 	}
 
 	protected void checkResult(CollectionListeners listeners,
 							 CollectionListeners.Listener listenerExpected,
-							 Object ownerExpected,
+							 Entity ownerExpected,
 							 Collection collExpected,
 							 int index) {
 		assertSame( listenerExpected, listeners.getListenersCalled().get( index ) );
 		assertSame(
 				ownerExpected,
-				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwner()
+				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwnerOrNull()
 		);
+		assertEquals(
+				ownerExpected.getId(),
+				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwnerIdOrNull()
+		);
+		assertEquals(
+				ownerExpected.getClass().getName(),
+				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwnerEntityName()
+		);
 		assertSame(
 				collExpected, ( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getCollection()
 		);

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/BrokenCollectionEventTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/BrokenCollectionEventTest.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/BrokenCollectionEventTest.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -112,7 +112,7 @@
 	/*
 	public void testUpdateDetachedParentOneChildToNullFailureExpected() {
 		CollectionListeners listeners = new CollectionListeners( getSessions() );
-		AbstractParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
 		Child oldChild = ( Child ) parent.getChildren().iterator().next();
 		assertEquals( 1, parent.getChildren().size() );
 		listeners.clear();
@@ -126,9 +126,9 @@
 		int index = 0;
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
-		if ( oldChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), oldChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), oldChild, index++ );
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) oldChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) oldChild, index++ );
 		}
 		// pre- and post- collection recreate events should be created when updating an entity with a "null" collection
 		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
@@ -186,7 +186,7 @@
 	/*
 	public void testUpdateParentOneChildToNullFailureExpected() {
 		CollectionListeners listeners = new CollectionListeners( getSessions() );
-		AbstractParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
 		Child oldChild = ( Child ) parent.getChildren().iterator().next();
 		assertEquals( 1, parent.getChildren().size() );
 		listeners.clear();
@@ -204,14 +204,18 @@
 		if ( ( ( PersistentCollection ) oldCollection ).wasInitialized() ) {
 			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, oldCollection, index++ );
 		}
-		if ( oldChild.hasBidirectionalManyToMany() && ( ( PersistentCollection ) getParents( oldChild ) ).wasInitialized() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), oldChild, index++ );
+		ChildWithBidirectionalManyToMany oldChildWithManyToMany = null;
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			oldChildWithManyToMany = ( ChildWithBidirectionalManyToMany ) oldChild;
+			if ( ( ( PersistentCollection ) oldChildWithManyToMany.getParents() ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), oldChildWithManyToMany, index++ );
+			}
 		}
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
-		if ( oldChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), oldChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), oldChild, index++ );
+		if ( oldChildWithManyToMany != null ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), oldChildWithManyToMany, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), oldChildWithManyToMany, index++ );
 		}
 		// pre- and post- collection recreate events should be created when updating an entity with a "null" collection
 		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
@@ -221,7 +225,7 @@
 
 	public void testUpdateMergedParentOneChildToNullFailureExpected() {
 		CollectionListeners listeners = new CollectionListeners( getSessions() );
-		AbstractParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
 		assertEquals( 1, parent.getChildren().size() );
 		listeners.clear();
 		Session s = openSession();
@@ -233,14 +237,18 @@
 		s.close();
 		int index = 0;
 		Child oldChild = ( Child ) oldCollection.iterator().next();
-		if ( oldChild.hasBidirectionalManyToMany() && ( ( PersistentCollection ) getParents( oldChild ) ).wasInitialized() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), oldChild, index++ );
+		ChildWithBidirectionalManyToMany oldChildWithManyToMany = null;
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			oldChildWithManyToMany = ( ChildWithBidirectionalManyToMany ) oldChild;
+			if ( ( ( PersistentCollection ) oldChildWithManyToMany.getParents() ).wasInitialized() ) {
 		}
+			checkResult( listeners, listeners.getInitializeCollectionListener(), oldChildWithManyToMany, index++ );
+		}
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
-		if ( oldChild.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), oldChild, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), oldChild, index++ );
+		if ( oldChildWithManyToMany != null ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), oldChildWithManyToMany, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), oldChildWithManyToMany, index++ );
 		}
 		// pre- and post- collection recreate events should be created when updating an entity with a "null" collection
 		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
@@ -282,34 +290,37 @@
 		return parent;
 	}
 
-	private Collection getParents( Child child ) {
-		return ( ( child instanceof ChildWithBidirectionalManyToMany )
-						? ( ( ChildWithBidirectionalManyToMany ) child ).getParents()
-						: null );
-	}
-	private void checkResult(CollectionListeners listeners,
+	protected void checkResult(CollectionListeners listeners,
 							 CollectionListeners.Listener listenerExpected,
 							 ParentWithCollection parent,
 							 int index) {
 		checkResult( listeners, listenerExpected, parent, parent.getChildren(), index );
 	}
-	private void checkResult(CollectionListeners listeners,
+	protected void checkResult(CollectionListeners listeners,
 							 CollectionListeners.Listener listenerExpected,
-							 Child child,
+							 ChildWithBidirectionalManyToMany child,
 							 int index) {
-		checkResult( listeners, listenerExpected, child, getParents( child ), index );
+		checkResult( listeners, listenerExpected, child, child.getParents(), index );
 	}
 
-	private void checkResult(CollectionListeners listeners,
+	protected void checkResult(CollectionListeners listeners,
 							 CollectionListeners.Listener listenerExpected,
-							 Object ownerExpected,
+							 Entity ownerExpected,
 							 Collection collExpected,
 							 int index) {
 		assertSame( listenerExpected, listeners.getListenersCalled().get( index ) );
 		assertSame(
 				ownerExpected,
-				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwner()
+				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwnerOrNull()
 		);
+		assertEquals(
+				ownerExpected.getId(),
+				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwnerIdOrNull()
+		);
+		assertEquals(
+				ownerExpected.getClass().getName(),
+				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwnerEntityName()
+		);
 		assertSame(
 				collExpected, ( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getCollection()
 		);

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/Child.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/Child.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/Child.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -27,8 +27,6 @@
  */
 public interface Child {
 
-	boolean hasBidirectionalManyToMany();
-
 	String getName();
 
 	void setName(String name);

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/ChildEntity.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/ChildEntity.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/ChildEntity.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -25,10 +25,9 @@
  *
  * @author Gail Badner
  */
-public class ChildEntity extends ChildValue {
+public class ChildEntity extends ChildValue implements Entity {
 	private Long id;
 
-
 	public ChildEntity() {
 		super();
 	}

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/ChildValue.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/ChildValue.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/ChildValue.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -35,10 +35,6 @@
 		this.name = name;
 	}
 
-	public boolean hasBidirectionalManyToMany() {
-		return false;
-	}
-
 	public String getName() {
 		return name;
 	}

Added: core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/Entity.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/Entity.java	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/Entity.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -0,0 +1,14 @@
+package org.hibernate.test.event.collection;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: gbadner
+ * Date: Jan 30, 2008
+ * Time: 2:39:37 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public interface Entity {
+	Long getId();
+
+	void setId(Long id);
+}

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/ParentWithCollection.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/ParentWithCollection.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/ParentWithCollection.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -27,7 +27,7 @@
  *
  * @author Gail Badner
  */
-public interface ParentWithCollection {
+public interface ParentWithCollection extends Entity {
 	void newChildren(Collection collection);
 
 	Child createChild(String name);

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/AbstractAssociationCollectionEventTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/AbstractAssociationCollectionEventTest.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/AbstractAssociationCollectionEventTest.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -21,12 +21,13 @@
  */
 package org.hibernate.test.event.collection.association;
 
+import org.hibernate.Session;
+import org.hibernate.Transaction;
 import org.hibernate.test.event.collection.AbstractCollectionEventTest;
+import org.hibernate.test.event.collection.ChildEntity;
 import org.hibernate.test.event.collection.CollectionListeners;
-import org.hibernate.test.event.collection.ChildEntity;
 import org.hibernate.test.event.collection.ParentWithCollection;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
+import org.hibernate.test.event.collection.association.bidirectional.manytomany.ChildWithBidirectionalManyToMany;
 
 /**
  *
@@ -52,14 +53,14 @@
 		s.close();
 		int index = 0;
 		checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
-		if ( child.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getInitializeCollectionListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
 		}
 		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, index++ );
 		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, index++ );
-		if ( child.hasBidirectionalManyToMany() ) {
-			checkResult( listeners, listeners.getPreCollectionUpdateListener(), child, index++ );
-			checkResult( listeners, listeners.getPostCollectionUpdateListener(), child, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
 		}
 		checkNumberOfResults( listeners, index );
 	}

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ChildWithBidirectionalManyToMany.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ChildWithBidirectionalManyToMany.java	2008-02-25 20:15:43 UTC (rev 14362)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ChildWithBidirectionalManyToMany.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -40,10 +40,6 @@
 		this.parents = parents;
 	}
 
-	public boolean hasBidirectionalManyToMany() {
-		return true;
-	}
-
 	public Collection getParents() {
 		return parents;
 	}

Added: core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassCollectionEventTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassCollectionEventTest.java	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassCollectionEventTest.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -0,0 +1,57 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.bidirectional.onetomany;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import junit.framework.Test;
+
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.event.collection.Child;
+import org.hibernate.test.event.collection.ParentWithCollection;
+import org.hibernate.test.event.collection.association.AbstractAssociationCollectionEventTest;
+import org.hibernate.test.event.collection.association.bidirectional.onetomany.ChildWithManyToOne;
+import org.hibernate.test.event.collection.association.bidirectional.onetomany.ParentWithBidirectionalOneToMany;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class BidirectionalOneToManyBagSubclassCollectionEventTest extends BidirectionalOneToManyBagCollectionEventTest {
+
+	public BidirectionalOneToManyBagSubclassCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BidirectionalOneToManyBagSubclassCollectionEventTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassMapping.hbm.xml" };
+	}
+
+	public ParentWithCollection createParent(String name) {
+		return new ParentWithBidirectionalOneToManySubclass( name );
+	}
+}
\ No newline at end of file

Added: core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassMapping.hbm.xml
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassMapping.hbm.xml	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassMapping.hbm.xml	2008-02-25 21:06:19 UTC (rev 14363)
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.event.collection.association.bidirectional.onetomany">
+
+    <class name="ParentWithBidirectionalOneToMany" table="PARENT" discriminator-value="P">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+
+        <discriminator column="TYPE" type="string" length="1"/>
+
+        <bag name="children"
+             inverse="true"
+             cascade="all">
+            <key column="parent_id"/>
+            <one-to-many class="ChildWithManyToOne"/>
+        </bag>
+
+        <subclass name="ParentWithBidirectionalOneToManySubclass"
+            discriminator-value="S">
+        </subclass>
+    </class>
+
+    <class name="ChildWithManyToOne" table="CHILD">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <many-to-one name="parent" column="parent_id" class="ParentWithBidirectionalOneToMany" cascade="none"/>
+    </class>
+
+</hibernate-mapping>

Added: core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToManySubclass.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToManySubclass.java	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToManySubclass.java	2008-02-25 21:06:19 UTC (rev 14363)
@@ -0,0 +1,42 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.bidirectional.onetomany;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.hibernate.test.event.collection.Child;
+import org.hibernate.test.event.collection.AbstractParentWithCollection;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class ParentWithBidirectionalOneToManySubclass extends ParentWithBidirectionalOneToMany {
+	public ParentWithBidirectionalOneToManySubclass() {
+	}
+
+	public ParentWithBidirectionalOneToManySubclass(String name) {
+		super( name );
+	}
+
+}
\ No newline at end of file




More information about the hibernate-commits mailing list