⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 entityidentityinsertaction.java

📁 一个Java持久层类库
💻 JAVA
字号:
//$Id: EntityIdentityInsertAction.java 10680 2006-11-01 22:53:30Z epbernard $package org.hibernate.action;import java.io.Serializable;import org.hibernate.HibernateException;import org.hibernate.AssertionFailure;import org.hibernate.engine.SessionImplementor;import org.hibernate.engine.EntityKey;import org.hibernate.event.PostInsertEvent;import org.hibernate.event.PostInsertEventListener;import org.hibernate.event.PreInsertEvent;import org.hibernate.event.PreInsertEventListener;import org.hibernate.event.EventSource;import org.hibernate.persister.entity.EntityPersister;public final class EntityIdentityInsertAction extends EntityAction {	private final Object[] state;	private final boolean isDelayed;	private final EntityKey delayedEntityKey;	//private CacheEntry cacheEntry;	private Serializable generatedId;	public EntityIdentityInsertAction(			Object[] state,	        Object instance,	        EntityPersister persister,	        SessionImplementor session,	        boolean isDelayed) throws HibernateException {		super( session, null, instance, persister );		this.state = state;		this.isDelayed = isDelayed;		delayedEntityKey = isDelayed ? generateDelayedEntityKey() : null;	}	public void execute() throws HibernateException {				final EntityPersister persister = getPersister();		final SessionImplementor session = getSession();		final Object instance = getInstance();				boolean veto = preInsert();		// Don't need to lock the cache here, since if someone		// else inserted the same pk first, the insert would fail		if ( !veto ) {			generatedId = persister.insert( state, instance, session );			if ( persister.hasInsertGeneratedProperties() ) {				persister.processInsertGeneratedProperties( generatedId, instance, state, session );			}			//need to do that here rather than in the save event listener to let			//the post insert events to have a id-filled entity when IDENTITY is used (EJB3)			persister.setIdentifier( instance, generatedId, session.getEntityMode() );		}		//TODO: this bit actually has to be called after all cascades!		//      but since identity insert is called *synchronously*,		//      instead of asynchronously as other actions, it isn't		/*if ( persister.hasCache() && !persister.isCacheInvalidationRequired() ) {			cacheEntry = new CacheEntry(object, persister, session);			persister.getCache().insert(generatedId, cacheEntry);		}*/				postInsert();		if ( session.getFactory().getStatistics().isStatisticsEnabled() && !veto ) {			session.getFactory().getStatisticsImplementor()					.insertEntity( getPersister().getEntityName() );		}	}	private void postInsert() {		if ( isDelayed ) {			getSession().getPersistenceContext().replaceDelayedEntityIdentityInsertKeys( delayedEntityKey, generatedId );		}		PostInsertEventListener[] postListeners = getSession().getListeners()				.getPostInsertEventListeners();		if (postListeners.length>0) {			PostInsertEvent postEvent = new PostInsertEvent(					getInstance(),					generatedId,					state,					getPersister(),					(EventSource) getSession()			);			for ( int i = 0; i < postListeners.length; i++ ) {				postListeners[i].onPostInsert(postEvent);			}		}	}	private void postCommitInsert() {		PostInsertEventListener[] postListeners = getSession().getListeners()				.getPostCommitInsertEventListeners();		if (postListeners.length>0) {			PostInsertEvent postEvent = new PostInsertEvent(					getInstance(),					generatedId,					state,					getPersister(),					(EventSource) getSession() 			);			for ( int i = 0; i < postListeners.length; i++ ) {				postListeners[i].onPostInsert(postEvent);			}		}	}	private boolean preInsert() {		PreInsertEventListener[] preListeners = getSession().getListeners()				.getPreInsertEventListeners();		boolean veto = false;		if (preListeners.length>0) {			PreInsertEvent preEvent = new PreInsertEvent( getInstance(), null, state, getPersister(), getSession() );			for ( int i = 0; i < preListeners.length; i++ ) {				veto = preListeners[i].onPreInsert(preEvent) || veto;			}		}		return veto;	}	//Make 100% certain that this is called before any subsequent ScheduledUpdate.afterTransactionCompletion()!!	public void afterTransactionCompletion(boolean success) throws HibernateException {		//TODO: reenable if we also fix the above todo		/*EntityPersister persister = getEntityPersister();		if ( success && persister.hasCache() && !persister.isCacheInvalidationRequired() ) {			persister.getCache().afterInsert( getGeneratedId(), cacheEntry );		}*/		postCommitInsert();	}	public boolean hasAfterTransactionCompletion() {		//TODO: simply remove this override		//      if we fix the above todos		return hasPostCommitEventListeners();	}	protected boolean hasPostCommitEventListeners() {		return getSession().getListeners().getPostCommitInsertEventListeners().length>0;	}		public final Serializable getGeneratedId() {		return generatedId;	}	public EntityKey getDelayedEntityKey() {		return delayedEntityKey;	}	private synchronized EntityKey generateDelayedEntityKey() {		if ( !isDelayed ) {			throw new AssertionFailure( "cannot request delayed entity-key for non-delayed post-insert-id generation" );		}		return new EntityKey( new DelayedPostInsertIdentifier(), getPersister(), getSession().getEntityMode() );	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -