[hibernate-commits] Hibernate SVN: r18733 - in core/trunk: core/src/main/java/org/hibernate/event/def and 10 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Feb 8 14:27:01 EST 2010


Author: steve.ebersole at jboss.com
Date: 2010-02-08 14:27:00 -0500 (Mon, 08 Feb 2010)
New Revision: 18733

Modified:
   core/trunk/core/src/main/java/org/hibernate/engine/Cascade.java
   core/trunk/core/src/main/java/org/hibernate/engine/Collections.java
   core/trunk/core/src/main/java/org/hibernate/engine/ForeignKeys.java
   core/trunk/core/src/main/java/org/hibernate/event/def/DefaultDeleteEventListener.java
   core/trunk/core/src/main/java/org/hibernate/event/def/DefaultFlushEntityEventListener.java
   core/trunk/core/src/main/java/org/hibernate/event/def/DefaultLockEventListener.java
   core/trunk/core/src/main/java/org/hibernate/event/def/DefaultMergeEventListener.java
   core/trunk/core/src/main/java/org/hibernate/event/def/DefaultRefreshEventListener.java
   core/trunk/core/src/main/java/org/hibernate/event/def/DefaultReplicateEventListener.java
   core/trunk/core/src/main/java/org/hibernate/event/def/DefaultSaveOrUpdateEventListener.java
   core/trunk/core/src/main/java/org/hibernate/id/Assigned.java
   core/trunk/core/src/main/java/org/hibernate/impl/StatelessSessionImpl.java
   core/trunk/core/src/main/java/org/hibernate/mapping/Component.java
   core/trunk/core/src/main/java/org/hibernate/metadata/ClassMetadata.java
   core/trunk/core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java
   core/trunk/core/src/main/java/org/hibernate/persister/entity/EntityPersister.java
   core/trunk/core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java
   core/trunk/core/src/main/java/org/hibernate/tuple/entity/Dom4jEntityTuplizer.java
   core/trunk/core/src/main/java/org/hibernate/tuple/entity/EntityTuplizer.java
   core/trunk/core/src/main/java/org/hibernate/type/CollectionType.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java
   core/trunk/envers/src/main/java/org/hibernate/envers/tools/Tools.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/legacy/CustomPersister.java
Log:
HHH-4704 - Pass session into EntityTuplizer#setIdentifier


Modified: core/trunk/core/src/main/java/org/hibernate/engine/Cascade.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/engine/Cascade.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/engine/Cascade.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -251,8 +251,7 @@
 						if ( loadedValue != null ) {
 							final String entityName = entry.getPersister().getEntityName();
 							if ( log.isTraceEnabled() ) {
-								final Serializable id = entry.getPersister()
-										.getIdentifier( loadedValue, eventSource.getEntityMode() );
+								final Serializable id = entry.getPersister().getIdentifier( loadedValue, eventSource );
 								final String description = MessageHelper.infoString( entityName, id );
 								log.trace( "deleting orphaned entity instance: " + description );
 							}

Modified: core/trunk/core/src/main/java/org/hibernate/engine/Collections.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/engine/Collections.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/engine/Collections.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -85,8 +85,7 @@
 		boolean hasOrphanDelete = loadedPersister != null &&
 		                          loadedPersister.hasOrphanDelete();
 		if (hasOrphanDelete) {
-			Serializable ownerId = loadedPersister.getOwnerEntityPersister()
-					.getIdentifier( coll.getOwner(), session.getEntityMode() );
+			Serializable ownerId = loadedPersister.getOwnerEntityPersister().getIdentifier( coll.getOwner(), session );
 			if ( ownerId == null ) {
 				// the owning entity may have been deleted and its identifier unset due to
 				// identifier-rollback; in which case, try to look up its identifier from

Modified: core/trunk/core/src/main/java/org/hibernate/engine/ForeignKeys.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/engine/ForeignKeys.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/engine/ForeignKeys.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -209,8 +209,10 @@
 		if (assumed!=null) return assumed.booleanValue();
 		
 		// hit the database, after checking the session cache for a snapshot
-		Object[] snapshot = session.getPersistenceContext()
-		        .getDatabaseSnapshot( persister.getIdentifier( entity, session.getEntityMode() ), persister );
+		Object[] snapshot = session.getPersistenceContext().getDatabaseSnapshot(
+				persister.getIdentifier( entity, session ),
+				persister
+		);
 		return snapshot==null;
 
 	}
@@ -244,7 +246,7 @@
 							(entityName == null ? session.guessEntityName( object ) : entityName)
 					);
 				}
-				id = session.getEntityPersister( entityName, object ).getIdentifier( object, session.getEntityMode() );
+				id = session.getEntityPersister( entityName, object ).getIdentifier( object, session );
 			}
 			return id;
 		}

Modified: core/trunk/core/src/main/java/org/hibernate/event/def/DefaultDeleteEventListener.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/def/DefaultDeleteEventListener.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/event/def/DefaultDeleteEventListener.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -108,7 +108,7 @@
 				performDetachedEntityDeletionCheck( event );
 			}
 
-			id = persister.getIdentifier( entity, source.getEntityMode() );
+			id = persister.getIdentifier( entity, source );
 
 			if ( id == null ) {
 				throw new TransientObjectException(

Modified: core/trunk/core/src/main/java/org/hibernate/event/def/DefaultFlushEntityEventListener.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/def/DefaultFlushEntityEventListener.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/event/def/DefaultFlushEntityEventListener.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -68,7 +68,7 @@
 			EntityPersister persister,
 			Serializable id,
 			EntityMode entityMode,
-			SessionFactoryImplementor factory) throws HibernateException {
+			SessionImplementor session) throws HibernateException {
 
 		if ( id != null && id instanceof DelayedPostInsertIdentifier ) {
 			// this is a situation where the entity id is assigned by a post-insert generator
@@ -78,11 +78,11 @@
 
 		if ( persister.canExtractIdOutOfEntity() ) {
 
-			Serializable oid = persister.getIdentifier( object, entityMode );
+			Serializable oid = persister.getIdentifier( object, session );
 			if (id==null) {
 				throw new AssertionFailure("null id in " + persister.getEntityName() + " entry (don't flush the Session after an exception occurs)");
 			}
-			if ( !persister.getIdentifierType().isEqual( id, oid, entityMode, factory ) ) {
+			if ( !persister.getIdentifierType().isEqual( id, oid, entityMode, session.getFactory() ) ) {
 				throw new HibernateException(
 						"identifier of an instance of " +
 						persister.getEntityName() +
@@ -174,8 +174,7 @@
 			EntityEntry entry,
 			EntityMode entityMode,
 			boolean mightBeDirty,
-	        SessionImplementor session
-	) {
+	        SessionImplementor session) {
 		final Object[] loadedState = entry.getLoadedState();
 		final Status status = entry.getStatus();
 		final EntityPersister persister = entry.getPersister();
@@ -189,7 +188,7 @@
 			values = loadedState;
 		}
 		else {
-			checkId( entity, persister, entry.getId(), entityMode, session.getFactory() );
+			checkId( entity, persister, entry.getId(), entityMode, session );
 
 			// grab its current state
 			values = persister.getPropertyValues( entity, entityMode );

Modified: core/trunk/core/src/main/java/org/hibernate/event/def/DefaultLockEventListener.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/def/DefaultLockEventListener.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/event/def/DefaultLockEventListener.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -71,7 +71,7 @@
 		EntityEntry entry = source.getPersistenceContext().getEntry(entity);
 		if (entry==null) {
 			final EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );
-			final Serializable id = persister.getIdentifier( entity, source.getEntityMode() );
+			final Serializable id = persister.getIdentifier( entity, source );
 			if ( !ForeignKeys.isNotTransient( event.getEntityName(), entity, Boolean.FALSE, source ) ) {
 				throw new TransientObjectException(
 						"cannot lock an unsaved transient instance: " +

Modified: core/trunk/core/src/main/java/org/hibernate/event/def/DefaultMergeEventListener.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/def/DefaultMergeEventListener.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/event/def/DefaultMergeEventListener.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -209,7 +209,7 @@
 				EntityEntry entry = source.getPersistenceContext().getEntry( entity );
 				if ( entry == null ) {
 					EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );
-					Serializable id = persister.getIdentifier( entity, source.getEntityMode() );
+					Serializable id = persister.getIdentifier( entity, source );
 					if ( id != null ) {
 						EntityKey key = new EntityKey( id, persister, source.getEntityMode() );
 						Object managedEntity = source.getPersistenceContext().getEntity( key );
@@ -289,7 +289,7 @@
 		final EntityPersister persister = source.getEntityPersister( entityName, entity );
 
 		final Serializable id = persister.hasIdentifierProperty() ?
-				persister.getIdentifier( entity, source.getEntityMode() ) :
+				persister.getIdentifier( entity, source ) :
 		        null;
 		if ( copyCache.containsKey( entity ) ) {
 			persister.setIdentifier( copyCache.get( entity ), id, source );
@@ -367,11 +367,11 @@
 
 		Serializable id = event.getRequestedId();
 		if ( id == null ) {
-			id = persister.getIdentifier( entity, source.getEntityMode() );
+			id = persister.getIdentifier( entity, source );
 		}
 		else {
 			// check that entity id = requestedId
-			Serializable entityId = persister.getIdentifier( entity, source.getEntityMode() );
+			Serializable entityId = persister.getIdentifier( entity, source );
 			if ( !persister.getIdentifierType().isEqual( id, entityId, source.getEntityMode(), source.getFactory() ) ) {
 				throw new HibernateException( "merge requested with id not matching id of passed entity" );
 			}
@@ -468,7 +468,7 @@
 	private boolean existsInDatabase(Object entity, EventSource source, EntityPersister persister) {
 		EntityEntry entry = source.getPersistenceContext().getEntry( entity );
 		if ( entry == null ) {
-			Serializable id = persister.getIdentifier( entity, source.getEntityMode() );
+			Serializable id = persister.getIdentifier( entity, source );
 			if ( id != null ) {
 				EntityKey key = new EntityKey( id, persister, source.getEntityMode() );
 				Object managedEntity = source.getPersistenceContext().getEntity( key );

Modified: core/trunk/core/src/main/java/org/hibernate/event/def/DefaultRefreshEventListener.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/def/DefaultRefreshEventListener.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/event/def/DefaultRefreshEventListener.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -92,7 +92,7 @@
 		
 		if ( e == null ) {
 			persister = source.getEntityPersister(null, object); //refresh() does not pass an entityName
-			id = persister.getIdentifier( object, event.getSession().getEntityMode() );
+			id = persister.getIdentifier( object, event.getSession() );
 			if ( log.isTraceEnabled() ) {
 				log.trace(
 						"refreshing transient " +

Modified: core/trunk/core/src/main/java/org/hibernate/event/def/DefaultReplicateEventListener.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/def/DefaultReplicateEventListener.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/event/def/DefaultReplicateEventListener.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -83,7 +83,7 @@
 		/*if ( persister.isUnsaved(entity, source) ) {
 			throw new TransientObjectException("transient instance passed to replicate()");
 		}*/
-		Serializable id = persister.getIdentifier( entity, source.getEntityMode() );
+		Serializable id = persister.getIdentifier( entity, source );
 		if ( id == null ) {
 			throw new TransientObjectException( "instance with null id passed to replicate()" );
 		}

Modified: core/trunk/core/src/main/java/org/hibernate/event/def/DefaultSaveOrUpdateEventListener.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/def/DefaultSaveOrUpdateEventListener.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/event/def/DefaultSaveOrUpdateEventListener.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -265,7 +265,7 @@
 			Serializable requestedId,
 			SessionImplementor session) {
 		// use the id assigned to the instance
-		Serializable id = persister.getIdentifier( entity, session.getEntityMode() );
+		Serializable id = persister.getIdentifier( entity, session );
 		if ( id == null ) {
 			// assume this is a newly instantiated transient object
 			// which should be saved rather than updated

Modified: core/trunk/core/src/main/java/org/hibernate/id/Assigned.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/id/Assigned.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/id/Assigned.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -47,25 +47,20 @@
 	private String entityName;
 
 	public Serializable generate(SessionImplementor session, Object obj) throws HibernateException {
-		
-		final Serializable id = session.getEntityPersister( entityName, obj ) 
-				//TODO: cache the persister, this shows up in yourkit
-				.getIdentifier( obj, session.getEntityMode() );
-		
-		if (id==null) {
+		//TODO: cache the persister, this shows up in yourkit
+		final Serializable id = session.getEntityPersister( entityName, obj ).getIdentifier( obj, session );
+		if ( id == null ) {
 			throw new IdentifierGenerationException(
-				"ids for this class must be manually assigned before calling save(): " + 
-				entityName
+					"ids for this class must be manually assigned before calling save(): " + entityName
 			);
 		}
 		
 		return id;
 	}
 
-	public void configure(Type type, Properties params, Dialect d)
-	throws MappingException {
+	public void configure(Type type, Properties params, Dialect d) throws MappingException {
 		entityName = params.getProperty(ENTITY_NAME);
-		if (entityName==null) {
+		if ( entityName == null ) {
 			throw new MappingException("no entity name");
 		}
 	}

Modified: core/trunk/core/src/main/java/org/hibernate/impl/StatelessSessionImpl.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/impl/StatelessSessionImpl.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/impl/StatelessSessionImpl.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -129,7 +129,7 @@
 	public void delete(String entityName, Object entity) {
 		errorIfClosed();
 		EntityPersister persister = getEntityPersister(entityName, entity);
-		Serializable id = persister.getIdentifier(entity, EntityMode.POJO);
+		Serializable id = persister.getIdentifier( entity, this );
 		Object version = persister.getVersion(entity, EntityMode.POJO);
 		persister.delete(id, version, entity, this);
 	}
@@ -145,7 +145,7 @@
 	public void update(String entityName, Object entity) {
 		errorIfClosed();
 		EntityPersister persister = getEntityPersister(entityName, entity);
-		Serializable id = persister.getIdentifier(entity, EntityMode.POJO);
+		Serializable id = persister.getIdentifier( entity, this );
 		Object[] state = persister.getPropertyValues(entity, EntityMode.POJO);
 		Object oldVersion;
 		if ( persister.isVersioned() ) {
@@ -197,7 +197,7 @@
 
 	public void refresh(String entityName, Object entity, LockMode lockMode) {
 		final EntityPersister persister = this.getEntityPersister( entityName, entity );
-		final Serializable id = persister.getIdentifier( entity, getEntityMode() );
+		final Serializable id = persister.getIdentifier( entity, this );
 		if ( log.isTraceEnabled() ) {
 			log.trace(
 					"refreshing transient " +

Modified: core/trunk/core/src/main/java/org/hibernate/mapping/Component.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/mapping/Component.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/mapping/Component.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -419,8 +419,7 @@
 		}
 
 		public Serializable locateGenerationContext(SessionImplementor session, Object incomingObject) {
-			return session.getEntityPersister( entityName, incomingObject )
-					.getIdentifier( incomingObject, session.getEntityMode() );
+			return session.getEntityPersister( entityName, incomingObject ).getIdentifier( incomingObject, session );
 		}
 	}
 

Modified: core/trunk/core/src/main/java/org/hibernate/metadata/ClassMetadata.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/metadata/ClassMetadata.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/metadata/ClassMetadata.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -195,10 +195,22 @@
 
 	/**
 	 * Get the identifier of an instance (throw an exception if no identifier property)
+	 * @deprecated Use {@link #getIdentifier(Object,SessionImplementor)} instead
+	 * @noinspection JavaDoc
 	 */
-	public Serializable getIdentifier(Object entity, EntityMode entityMode) throws HibernateException;
+	public Serializable getIdentifier(Object object, EntityMode entityMode) throws HibernateException;
 
 	/**
+	 * Get the identifier of an instance (throw an exception if no identifier property)
+	 *
+	 * @param entity The entity for which to get the identifier
+	 * @param session The session from which the request originated
+	 *
+	 * @return The identifier
+	 */
+	public Serializable getIdentifier(Object entity, SessionImplementor session);
+
+	/**
 	 * Inject the identifier value into the given entity.
 	 * </p>
 	 * Has no effect if the entity does not define an identifier property

Modified: core/trunk/core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -3514,7 +3514,7 @@
 	public Boolean isTransient(Object entity, SessionImplementor session) throws HibernateException {
 		final Serializable id;
 		if ( canExtractIdOutOfEntity() ) {
-			id = getIdentifier( entity, session.getEntityMode() );
+			id = getIdentifier( entity, session );
 		}
 		else {
 			id = null;
@@ -3796,11 +3796,14 @@
 		return getTuplizer( entityMode ).getPropertyValue( object, propertyName );
 	}
 
-	public Serializable getIdentifier(Object object, EntityMode entityMode)
-			throws HibernateException {
-		return getTuplizer( entityMode ).getIdentifier( object );
+	public Serializable getIdentifier(Object object, EntityMode entityMode) throws HibernateException {
+		return getTuplizer( entityMode ).getIdentifier( object, null );
 	}
 
+	public Serializable getIdentifier(Object entity, SessionImplementor session) {
+		return getTuplizer( session.getEntityMode() ).getIdentifier( entity, session );
+	}
+
 	/**
 	 * {@inheritDoc}
 	 */

Modified: core/trunk/core/src/main/java/org/hibernate/persister/entity/EntityPersister.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/persister/entity/EntityPersister.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/persister/entity/EntityPersister.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -652,9 +652,21 @@
 
 	/**
 	 * Get the identifier of an instance (throw an exception if no identifier property)
+	 * @deprecated Use {@link #getIdentifier(Object,SessionImplementor)} instead
+	 * @noinspection JavaDoc
 	 */
 	public Serializable getIdentifier(Object object, EntityMode entityMode) throws HibernateException;
 
+	/**
+	 * Get the identifier of an instance (throw an exception if no identifier property)
+	 *
+	 * @param entity The entity for which to get the identifier
+	 * @param session The session from which the request originated
+	 *
+	 * @return The identifier
+	 */
+	public Serializable getIdentifier(Object entity, SessionImplementor session);
+
     /**
      * Inject the identifier value into the given entity.
      * </p>

Modified: core/trunk/core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -28,12 +28,20 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.hibernate.EntityMode;
 import org.hibernate.HibernateException;
 import org.hibernate.MappingException;
+import org.hibernate.engine.Cascade;
+import org.hibernate.engine.EntityEntry;
 import org.hibernate.engine.EntityKey;
 import org.hibernate.engine.SessionFactoryImplementor;
 import org.hibernate.engine.SessionImplementor;
+import org.hibernate.event.EventSource;
+import org.hibernate.event.PersistEvent;
+import org.hibernate.event.SaveOrUpdateEvent;
 import org.hibernate.id.Assigned;
 import org.hibernate.intercept.LazyPropertyInitializer;
 import org.hibernate.mapping.Component;
@@ -42,6 +50,7 @@
 import org.hibernate.persister.entity.EntityPersister;
 import org.hibernate.property.Getter;
 import org.hibernate.property.Setter;
+import org.hibernate.proxy.HibernateProxy;
 import org.hibernate.proxy.ProxyFactory;
 import org.hibernate.tuple.Instantiator;
 import org.hibernate.tuple.StandardProperty;
@@ -60,6 +69,8 @@
  */
 public abstract class AbstractEntityTuplizer implements EntityTuplizer {
 
+	private static final Logger log = LoggerFactory.getLogger( AbstractEntityTuplizer.class );
+
 	//TODO: currently keeps Getters and Setters (instead of PropertyAccessors) because of the way getGetter() and getSetter() are implemented currently; yuck!
 
 	private final EntityMetamodel entityMetamodel;
@@ -198,6 +209,10 @@
 	}
 
 	public Serializable getIdentifier(Object entity) throws HibernateException {
+		return getIdentifier( entity, null );
+	}
+
+	public Serializable getIdentifier(Object entity, SessionImplementor session) {
 		final Object id;
 		if ( entityMetamodel.getIdentifierProperty().isEmbedded() ) {
 			id = entity;
@@ -208,7 +223,7 @@
 					throw new HibernateException( "The class has no identifier property: " + getEntityName() );
 				}
 				else {
-					id = mappedIdentifierValueMarshaller.getIdentifier( entity, getEntityMode(), getFactory() );
+					id = mappedIdentifierValueMarshaller.getIdentifier( entity, getEntityMode(), session );
 				}
 			}
 			else {
@@ -255,13 +270,13 @@
 			idSetter.set( entity, id, getFactory() );
 		}
 		else if ( identifierMapperType != null ) {
-			mappedIdentifierValueMarshaller.setIdentifier( entity, id, session );
+			mappedIdentifierValueMarshaller.setIdentifier( entity, id, getEntityMode(), session );
 		}
 	}
 
 	private static interface MappedIdentifierValueMarshaller {
-		public Object getIdentifier(Object entity, EntityMode entityMode, SessionFactoryImplementor factory);
-		public void setIdentifier(Object entity, Serializable id, SessionImplementor session);
+		public Object getIdentifier(Object entity, EntityMode entityMode, SessionImplementor session);
+		public void setIdentifier(Object entity, Serializable id, EntityMode entityMode, SessionImplementor session);
 	}
 
 	private final MappedIdentifierValueMarshaller mappedIdentifierValueMarshaller;
@@ -304,18 +319,18 @@
 			this.mappedIdentifierType = mappedIdentifierType;
 		}
 
-		public Object getIdentifier(Object entity, EntityMode entityMode, SessionFactoryImplementor factory) {
+		public Object getIdentifier(Object entity, EntityMode entityMode, SessionImplementor session) {
 			Object id = mappedIdentifierType.instantiate( entityMode );
 			final Object[] propertyValues = virtualIdComponent.getPropertyValues( entity, entityMode );
 			mappedIdentifierType.setPropertyValues( id, propertyValues, entityMode );
 			return id;
 		}
 
-		public void setIdentifier(Object entity, Serializable id, SessionImplementor session) {
+		public void setIdentifier(Object entity, Serializable id, EntityMode entityMode, SessionImplementor session) {
 			virtualIdComponent.setPropertyValues(
 					entity,
 					mappedIdentifierType.getPropertyValues( id, session ),
-					session.getEntityMode()
+					entityMode
 			);
 		}
 	}
@@ -329,47 +344,79 @@
 			this.mappedIdentifierType = mappedIdentifierType;
 		}
 
-		public Object getIdentifier(Object entity, EntityMode entityMode, SessionFactoryImplementor factory) {
-			Object id = mappedIdentifierType.instantiate( entityMode );
+		public Object getIdentifier(Object entity, EntityMode entityMode, SessionImplementor session) {
+			final Object id = mappedIdentifierType.instantiate( entityMode );
 			final Object[] propertyValues = virtualIdComponent.getPropertyValues( entity, entityMode );
-			Type[] subTypes = virtualIdComponent.getSubtypes();
-			Type[] copierSubTypes = mappedIdentifierType.getSubtypes();
+			final Type[] subTypes = virtualIdComponent.getSubtypes();
+			final Type[] copierSubTypes = mappedIdentifierType.getSubtypes();
 			final int length = subTypes.length;
 			for ( int i = 0 ; i < length; i++ ) {
 				if ( propertyValues[i] == null ) {
-					continue;
+					throw new HibernateException( "No part of a composite identifier may be null" );
 				}
-				//JPA 2 in @IdClass points to the pk of the entity
+				//JPA 2 @MapsId + @IdClass points to the pk of the entity
 				if ( subTypes[i].isAssociationType() && ! copierSubTypes[i].isAssociationType() ) {
-					final String associatedEntityName = ( ( EntityType ) subTypes[i] ).getAssociatedEntityName();
-					final EntityPersister entityPersister = factory.getEntityPersister( associatedEntityName );
-					propertyValues[i] = entityPersister.getIdentifier( propertyValues[i], entityMode );
+					// we need a session to handle this use case
+					if ( session == null ) {
+						throw new AssertionError(
+								"Deprecated version of getIdentifier (no session) was used but session was required"
+						);
+					}
+					final Object subId;
+					if ( HibernateProxy.class.isInstance( propertyValues[i] ) ) {
+						subId = ( (HibernateProxy) propertyValues[i] ).getHibernateLazyInitializer().getIdentifier();
+					}
+					else {
+						EntityEntry pcEntry = session.getPersistenceContext().getEntry( propertyValues[i] );
+						if ( pcEntry != null ) {
+							subId = pcEntry.getId();
+						}
+						else {
+							log.debug( "Performing implicit derived identity cascade" );
+							final PersistEvent event = new PersistEvent( null, propertyValues[i], (EventSource) session );
+							for ( int x = 0; x < session.getListeners().getPersistEventListeners().length; x++ ) {
+								session.getListeners().getPersistEventListeners()[x].onPersist( event );
+
+							}
+							pcEntry = session.getPersistenceContext().getEntry( propertyValues[i] );
+							if ( pcEntry == null || pcEntry.getId() == null ) {
+								throw new HibernateException( "Unable to process implicit derived identity cascade" );
+							}
+							else {
+								subId = pcEntry.getId();
+							}
+						}
+					}
+					propertyValues[i] = subId;
 				}
 			}
 			mappedIdentifierType.setPropertyValues( id, propertyValues, entityMode );
 			return id;
 		}
 
-		public void setIdentifier(Object entity, Serializable id, SessionImplementor session) {
-			final Object[] extractedValues = mappedIdentifierType.getPropertyValues( id, session.getEntityMode() );
+		public void setIdentifier(Object entity, Serializable id, EntityMode entityMode, SessionImplementor session) {
+			final Object[] extractedValues = mappedIdentifierType.getPropertyValues( id, entityMode );
 			final Object[] injectionValues = new Object[ extractedValues.length ];
 			for ( int i = 0; i < virtualIdComponent.getSubtypes().length; i++ ) {
 				final Type virtualPropertyType = virtualIdComponent.getSubtypes()[i];
 				final Type idClassPropertyType = mappedIdentifierType.getSubtypes()[i];
 				if ( virtualPropertyType.isEntityType() && ! idClassPropertyType.isEntityType() ) {
+					if ( session == null ) {
+						throw new AssertionError(
+								"Deprecated version of getIdentifier (no session) was used but session was required"
+						);
+					}
 					final String associatedEntityName = ( (EntityType) virtualPropertyType ).getAssociatedEntityName();
 					final EntityKey entityKey = new EntityKey(
 							(Serializable) extractedValues[i],
 							session.getFactory().getEntityPersister( associatedEntityName ),
-							session.getEntityMode()
+							entityMode
 					);
 					// it is conceivable there is a proxy, so check that first
-					Object association = session.getPersistenceContext()
-							.getProxy( entityKey );
+					Object association = session.getPersistenceContext().getProxy( entityKey );
 					if ( association == null ) {
 						// otherwise look for an initialized version
-						association = session.getPersistenceContext()
-								.getEntity( entityKey );
+						association = session.getPersistenceContext().getEntity( entityKey );
 					}
 					injectionValues[i] = association;
 				}

Modified: core/trunk/core/src/main/java/org/hibernate/tuple/entity/Dom4jEntityTuplizer.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/tuple/entity/Dom4jEntityTuplizer.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/tuple/entity/Dom4jEntityTuplizer.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -24,6 +24,7 @@
  */
 package org.hibernate.tuple.entity;
 
+import org.hibernate.engine.SessionImplementor;
 import org.hibernate.mapping.PersistentClass;
 import org.hibernate.mapping.Property;
 import org.hibernate.proxy.ProxyFactory;
@@ -117,15 +118,22 @@
 	 * {@inheritDoc}
 	 */
 	public Serializable getIdentifier(Object entityOrId) throws HibernateException {
-		if (entityOrId instanceof Element) {
-			return super.getIdentifier(entityOrId);
+		return getIdentifier( entityOrId, null );
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Serializable getIdentifier(Object entityOrId, SessionImplementor session) {
+		if ( entityOrId instanceof Element ) {
+			return super.getIdentifier( entityOrId, session );
 		}
 		else {
 			//it was not embedded, so the argument is just an id
 			return (Serializable) entityOrId;
 		}
 	}
-	
+
 	/**
 	 * {@inheritDoc}
 	 */

Modified: core/trunk/core/src/main/java/org/hibernate/tuple/entity/EntityTuplizer.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/tuple/entity/EntityTuplizer.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/tuple/entity/EntityTuplizer.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -79,13 +79,27 @@
      * Extract the identifier value from the given entity.
      *
      * @param entity The entity from which to extract the identifier value.
+	 *
      * @return The identifier value.
+	 *
      * @throws HibernateException If the entity does not define an identifier property, or an
-     * error occurrs accessing its value.
+     * error occurs accessing its value.
+	 *
+	 * @deprecated Use {@link #getIdentifier(Object,SessionImplementor)} instead.
      */
 	public Serializable getIdentifier(Object entity) throws HibernateException;
 
     /**
+     * Extract the identifier value from the given entity.
+     *
+     * @param entity The entity from which to extract the identifier value.
+	 * @param session The session from which is requests originates
+	 *
+     * @return The identifier value.
+     */
+	public Serializable getIdentifier(Object entity, SessionImplementor session);
+
+    /**
      * Inject the identifier value into the given entity.
      * </p>
      * Has no effect if the entity does not define an identifier property

Modified: core/trunk/core/src/main/java/org/hibernate/type/CollectionType.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/type/CollectionType.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/core/src/main/java/org/hibernate/type/CollectionType.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -403,7 +403,7 @@
 			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() );
+				ownerId = ownerPersister.getIdentifier( key, session );
 			}
 			else {
 				// TODO: check if key contains the owner ID

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -60,7 +60,7 @@
 		EventSource source = event.getSession();
 		String entityName = event.getEntityName();
 		EntityPersister persister = source.getEntityPersister( entityName, event.getObject() );
-		Serializable id =  persister.getIdentifier( event.getObject(), source.getEntityMode() );
+		Serializable id =  persister.getIdentifier( event.getObject(), source );
 		entityName = entityName == null ? source.guessEntityName( event.getObject() ) : entityName; 
 		throw new IllegalArgumentException("Removing a detached instance "+ entityName + "#" + id);
 	}

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/tools/Tools.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/tools/Tools.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/tools/Tools.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -64,7 +64,7 @@
 		}
 
 
-		return session.getEntityPersister(null, obj).getIdentifier(obj, session.getEntityMode());
+		return session.getEntityPersister( null, obj ).getIdentifier( obj, session );
 	}
 
     public static Object getTargetFromProxy(SessionFactoryImplementor sessionFactoryImplementor, HibernateProxy proxy) {

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/legacy/CustomPersister.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/legacy/CustomPersister.java	2010-02-08 19:14:29 UTC (rev 18732)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/legacy/CustomPersister.java	2010-02-08 19:27:00 UTC (rev 18733)
@@ -182,6 +182,11 @@
 		return ( (Custom) object ).id;
 	}
 
+	public Serializable getIdentifier(Object entity, SessionImplementor session) {
+		checkEntityMode( session );
+		return ( (Custom) entity ).id;
+	}
+
 	public void setIdentifier(Object object, Serializable id, EntityMode entityMode) throws HibernateException {
 		checkEntityMode( entityMode );
 		( (Custom) object ).id = (String) id;



More information about the hibernate-commits mailing list