Open Source Repository

Home /hibernate/hibernate-3.2.7.ga | Repository Home


org/hibernate/event/def/DefaultEvictEventListener.java
//$Id: DefaultEvictEventListener.java 15864 2009-02-03 01:16:57Z [email protected] $
package org.hibernate.event.def;

import java.io.Serializable;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.engine.Cascade;
import org.hibernate.engine.CascadingAction;
import org.hibernate.engine.EntityEntry;
import org.hibernate.engine.EntityKey;
import org.hibernate.engine.PersistenceContext;
import org.hibernate.event.EventSource;
import org.hibernate.event.EvictEvent;
import org.hibernate.event.EvictEventListener;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.pretty.MessageHelper;
import org.hibernate.proxy.HibernateProxy;
import org.hibernate.proxy.LazyInitializer;

/**
 * Defines the default evict event listener used by hibernate for evicting entities
 * in response to generated flush events.  In particular, this implementation will
 * remove any hard references to the entity that are held by the infrastructure
 * (references held by application or other persistent instances are okay)
 *
 @author Steve Ebersole
 */
public class DefaultEvictEventListener implements EvictEventListener {

  private static final Log log = LogFactory.getLog(DefaultEvictEventListener.class);

  /** 
   * Handle the given evict event.
   *
   @param event The evict event to be handled.
   @throws HibernateException
   */
  public void onEvict(EvictEvent eventthrows HibernateException {
    EventSource source = event.getSession();
    final Object object = event.getObject();
    final PersistenceContext persistenceContext = source.getPersistenceContext();

    if object instanceof HibernateProxy ) {
      LazyInitializer li = ( (HibernateProxyobject ).getHibernateLazyInitializer();
      Serializable id = li.getIdentifier();
      EntityPersister persister = source.getFactory().getEntityPersisterli.getEntityName() );
      if id == null ) {
        throw new IllegalArgumentException("null identifier");
      }
      EntityKey key = new EntityKeyid, persister, source.getEntityMode() );
      persistenceContext.removeProxykey );
      if !li.isUninitialized() ) {
        final Object entity = persistenceContext.removeEntity(key);
        if entity != null ) {
          EntityEntry e = event.getSession().getPersistenceContext().removeEntry(entity);
          doEvictentity, key, e.getPersister(), event.getSession() );
        }
      }
      li.unsetSession();
    }
    else {
      EntityEntry e = persistenceContext.removeEntryobject );
      if e != null ) {
        EntityKey key = new EntityKeye.getId(), e.getPersister(), source.getEntityMode()  );
        persistenceContext.removeEntitykey );
        doEvictobject, key, e.getPersister(), source );
      }
      
    }
  }

  protected void doEvict(
    final Object object, 
    final EntityKey key, 
    final EntityPersister persister,
    final EventSource sessionthrows HibernateException {

    if log.isTraceEnabled() ) {
      log.trace"evicting " + MessageHelper.infoString(persister) );
    }

    // remove all collections for the entity from the session-level cache
    if persister.hasCollections() ) {
      new EvictVisitorsession ).processobject, persister );
    }

    new CascadeCascadingAction.EVICT, Cascade.AFTER_EVICT, session )
        .cascadepersister, object );
  }
}