From: <hib...@li...> - 2006-06-06 20:52:08
|
Author: ste...@jb... Date: 2006-06-06 16:51:29 -0400 (Tue, 06 Jun 2006) New Revision: 9995 Modified: trunk/Hibernate3/src/org/hibernate/event/def/DefaultLoadEventListener.java trunk/Hibernate3/src/org/hibernate/impl/SessionImpl.java Log: HHH-1818 : changed behavior of contains(), load(), and get() after entity has been remove()ed Modified: trunk/Hibernate3/src/org/hibernate/event/def/DefaultLoadEventListener.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/event/def/DefaultLoadEventListener.java 2006-06-06 20:48:37 UTC (rev 9994) +++ trunk/Hibernate3/src/org/hibernate/event/def/DefaultLoadEventListener.java 2006-06-06 20:51:29 UTC (rev 9995) @@ -11,6 +11,7 @@ import org.hibernate.ObjectDeletedException; import org.hibernate.PersistentObjectException; import org.hibernate.TypeMismatchException; +import org.hibernate.EntityMode; import org.hibernate.cache.CacheConcurrencyStrategy; import org.hibernate.cache.CacheKey; import org.hibernate.cache.entry.CacheEntry; @@ -72,12 +73,19 @@ ); } - Class idClass = persister.getIdentifierType().getReturnedClass(); - if ( idClass != null && ! idClass.isInstance( event.getEntityId() ) ) { - throw new TypeMismatchException( - "Provided id of the wrong type. Expected: " + idClass + ", got " + event.getEntityId().getClass() - ); + if ( persister.getIdentifierType().isComponentType() && EntityMode.DOM4J == event.getSession().getEntityMode() ) { + // skip this check for composite-ids relating to dom4j entity-mode; + // alternatively, we could add a check to make sure the incoming id value is + // an instance of Element... } + else { + Class idClass = persister.getIdentifierType().getReturnedClass(); + if ( idClass != null && ! idClass.isInstance( event.getEntityId() ) ) { + throw new TypeMismatchException( + "Provided id of the wrong type. Expected: " + idClass + ", got " + event.getEntityId().getClass() + ); + } + } EntityKey keyToLoad = new EntityKey( event.getEntityId(), persister, source.getEntityMode() ); @@ -228,18 +236,21 @@ final LoadEventListener.LoadType options, final PersistenceContext persistenceContext ) { - Object existing = persistenceContext.getEntity(keyToLoad); + Object existing = persistenceContext.getEntity( keyToLoad ); if ( existing != null ) { // return existing object or initialized proxy (unless deleted) - log.trace("entity found in session cache"); + log.trace( "entity found in session cache" ); if ( options.isCheckDeleted() ) { - EntityEntry entry = persistenceContext.getEntry(existing); - throwObjectDeletedIfNecessary(event, entry); + EntityEntry entry = persistenceContext.getEntry( existing ); + Status status = entry.getStatus(); + if ( status == Status.DELETED || status == Status.GONE ) { + return null; + } } return existing; } else { - log.trace("creating new proxy for entity"); + log.trace( "creating new proxy for entity" ); // return new uninitialized proxy Object proxy = persister.createProxy( event.getEntityId(), event.getSession() ); persistenceContext.getBatchFetchQueue().addBatchLoadableEntityKey(keyToLoad); @@ -295,6 +306,7 @@ return proxy; } + protected static final Object REMOVED_ENTITY_MARKER = new Object(); /** * Coordinates the efforts to load a given entity. First, an attempt is @@ -320,6 +332,10 @@ } Object entity = loadFromSessionCache(event, keyToLoad, options); + if ( entity == REMOVED_ENTITY_MARKER ) { + log.debug( "load request found matching entity in context, but it is scheduled for removal; returning null" ); + return null; + } if ( entity != null ) { if ( log.isTraceEnabled() ) { log.trace( @@ -409,29 +425,21 @@ throws HibernateException { SessionImplementor session = event.getSession(); - Object old = session.getEntityUsingInterceptor(keyToLoad); + Object old = session.getEntityUsingInterceptor( keyToLoad ); if ( old != null ) { // this object was already loaded - EntityEntry oldEntry = session.getPersistenceContext().getEntry(old); + EntityEntry oldEntry = session.getPersistenceContext().getEntry( old ); if ( options.isCheckDeleted() ) { - throwObjectDeletedIfNecessary( event, oldEntry ); + Status status = oldEntry.getStatus(); + if ( status == Status.DELETED || status == Status.GONE ) { + return REMOVED_ENTITY_MARKER; + } } upgradeLock( old, oldEntry, event.getLockMode(), session ); } return old; } - private void throwObjectDeletedIfNecessary(LoadEvent event, EntityEntry oldEntry) { - Status status = oldEntry.getStatus(); - if ( status == Status.DELETED || status == Status.GONE ) { - throw new ObjectDeletedException( - "The object with that id was deleted", - event.getEntityId(), - event.getEntityClassName() - ); - } - } - /** * Attempts to load the entity from the second-level cache. * Modified: trunk/Hibernate3/src/org/hibernate/impl/SessionImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/impl/SessionImpl.java 2006-06-06 20:48:37 UTC (rev 9994) +++ trunk/Hibernate3/src/org/hibernate/impl/SessionImpl.java 2006-06-06 20:51:29 UTC (rev 9995) @@ -1612,7 +1612,11 @@ object = li.getImplementation(); } } - return persistenceContext.isEntryFor(object); + // A session is considered to contain an entity only if the entity has + // an entry in the session's persistence context and the entry reports + // that the entity has not been removed + EntityEntry entry = persistenceContext.getEntry( object ); + return entry != null && entry.getStatus() != Status.DELETED && entry.getStatus() != Status.GONE; } public Query createQuery(String queryString) { |