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(a)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