|
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) {
|