From: <hib...@li...> - 2006-08-04 20:29:48
|
Author: ste...@jb... Date: 2006-08-04 16:29:45 -0400 (Fri, 04 Aug 2006) New Revision: 10224 Modified: trunk/Hibernate3/src/org/hibernate/event/def/DefaultEvictEventListener.java Log: HHH-1954 : proxies and eviction Modified: trunk/Hibernate3/src/org/hibernate/event/def/DefaultEvictEventListener.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/event/def/DefaultEvictEventListener.java 2006-08-04 20:29:21 UTC (rev 10223) +++ trunk/Hibernate3/src/org/hibernate/event/def/DefaultEvictEventListener.java 2006-08-04 20:29:45 UTC (rev 10224) @@ -40,38 +40,35 @@ public void onEvict(EvictEvent event) throws HibernateException { EventSource source = event.getSession(); final Object object = event.getObject(); - final PersistenceContext persistenceContext = source.getPersistenceContext(); + if ( object instanceof HibernateProxy ) { - LazyInitializer li = ( (HibernateProxy) object ).getHibernateLazyInitializer(); Serializable id = li.getIdentifier(); EntityPersister persister = source.getFactory().getEntityPersister( li.getEntityName() ); - if (id==null) { + if ( id == null ) { throw new IllegalArgumentException("null identifier"); } - + EntityKey key = new EntityKey( id, persister, source.getEntityMode() ); - persistenceContext.removeProxy(key); - + persistenceContext.removeProxy( key ); + if ( !li.isUninitialized() ) { - final Object entity = persistenceContext.removeEntity(key); + final Object entity = persistenceContext.removeEntity( key ); if ( entity != null ) { - EntityEntry e = event.getSession().getPersistenceContext().removeEntry(entity); + EntityEntry e = event.getSession().getPersistenceContext().removeEntry( entity ); doEvict( entity, key, e.getPersister(), event.getSession() ); } } - + li.setSession( null ); } else { - - EntityEntry e = persistenceContext.removeEntry(object); + EntityEntry e = persistenceContext.removeEntry( object ); if ( e != null ) { EntityKey key = new EntityKey( e.getId(), e.getPersister(), source.getEntityMode() ); - persistenceContext.removeEntity(key); + persistenceContext.removeEntity( key ); doEvict( object, key, e.getPersister(), source ); } - } } @@ -87,15 +84,17 @@ } // remove all collections for the entity from the session-level cache - if ( persister.hasCollections() ) new EvictVisitor( session ).process( object, persister ); - + if ( persister.hasCollections() ) { + new EvictVisitor( session ).process( object, persister ); + } + // remove any snapshot, not really for memory management purposes, but // rather because it might now be stale, and there is no longer any // EntityEntry to take precedence // This is now handled by removeEntity() //session.getPersistenceContext().removeDatabaseSnapshot(key); - new Cascade(CascadingAction.EVICT, Cascade.AFTER_EVICT, session) - .cascade(persister, object); + new Cascade( CascadingAction.EVICT, Cascade.AFTER_EVICT, session ) + .cascade( persister, object ); } } |