[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