FileDocCategorySizeDatePackage
DefaultPersistEventListener.javaAPI DocHibernate 3.2.54195Wed Mar 22 07:58:00 GMT 2006org.hibernate.event.def

DefaultPersistEventListener

public class DefaultPersistEventListener extends AbstractSaveEventListener implements org.hibernate.event.PersistEventListener
Defines the default create event listener used by hibernate for creating transient entities in response to generated create events.
author
Gavin King

Fields Summary
private static final Log
log
Constructors Summary
Methods Summary
protected voidentityIsPersistent(org.hibernate.event.PersistEvent event, java.util.Map createCache)

		log.trace("ignoring persistent instance");
		final EventSource source = event.getSession();
		
		//TODO: check that entry.getIdentifier().equals(requestedId)
		
		final Object entity = source.getPersistenceContext().unproxy( event.getObject() );
		final EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );
		
		if ( createCache.put(entity, entity)==null ) {
			//TODO: merge into one method!
			cascadeBeforeSave(source, persister, entity, createCache);
			cascadeAfterSave(source, persister, entity, createCache);
		}

	
protected voidentityIsTransient(org.hibernate.event.PersistEvent event, java.util.Map createCache)
Handle the given create event.

param
event The save event to be handled.
throws
HibernateException

		
		log.trace("saving transient instance");

		final EventSource source = event.getSession();
		
		final Object entity = source.getPersistenceContext().unproxy( event.getObject() );
		
		if ( createCache.put(entity, entity)==null ) {
			saveWithGeneratedId( entity, event.getEntityName(), createCache, source, false );
		}

	
protected java.lang.BooleangetAssumedUnsaved()

		return Boolean.TRUE;
	
protected org.hibernate.engine.CascadingActiongetCascadeAction()

		return CascadingAction.PERSIST;
	
public voidonPersist(org.hibernate.event.PersistEvent event)
Handle the given create event.

param
event The create event to be handled.
throws
HibernateException


	                	 
	      
		onPersist( event, IdentityMap.instantiate(10) );
	
public voidonPersist(org.hibernate.event.PersistEvent event, java.util.Map createCache)
Handle the given create event.

param
event The create event to be handled.
throws
HibernateException

			
		final SessionImplementor source = event.getSession();
		final Object object = event.getObject();
		
		final Object entity;
		if (object instanceof HibernateProxy) {
			LazyInitializer li = ( (HibernateProxy) object ).getHibernateLazyInitializer();
			if ( li.isUninitialized() ) {
				if ( li.getSession()==source ) {
					return; //NOTE EARLY EXIT!
				}
				else {
					throw new PersistentObjectException("uninitialized proxy passed to persist()");
				}
			}
			entity = li.getImplementation();
		}
		else {
			entity = object;
		}
		
		int entityState = getEntityState( 
				entity, 
				event.getEntityName(), 
				source.getPersistenceContext().getEntry(entity), 
				source 
			);
		
		switch (entityState) {
			case DETACHED: 
				throw new PersistentObjectException( 
						"detached entity passed to persist: " + 
						getLoggableName( event.getEntityName(), entity ) 
					);
			case PERSISTENT:
				entityIsPersistent(event, createCache);
				break;
			case TRANSIENT:
				entityIsTransient(event, createCache);
				break;
			default: 
				throw new ObjectDeletedException( 
						"deleted entity passed to persist", 
						null, 
						getLoggableName( event.getEntityName(), entity )
					);
		}