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

📄 defaultpersisteventlistener.cs

📁 NHibernate NET开发者所需的
💻 CS
字号:
using System;
using System.Collections;
using log4net;
using NHibernate.Engine;
using NHibernate.Persister.Entity;
using NHibernate.Proxy;
using NHibernate.Util;

namespace NHibernate.Event.Default
{
	/// <summary> 
	/// Defines the default create event listener used by hibernate for creating
	/// transient entities in response to generated create events. 
	/// </summary>
	[Serializable]
	public class DefaultPersistEventListener : AbstractSaveEventListener, IPersistEventListener
	{
		private static readonly ILog log = LogManager.GetLogger(typeof(DefaultPersistEventListener));

		protected override CascadingAction CascadeAction
		{
			get { return CascadingAction.Persist; }
		}

		protected override bool? AssumedUnsaved
		{
			get { return true; }
		}

		public virtual void OnPersist(PersistEvent @event)
		{
			OnPersist(@event, IdentityMap.Instantiate(10));
		}

		public virtual void OnPersist(PersistEvent @event, IDictionary createdAlready)
		{
			ISessionImplementor source = @event.Session;
			object obj = @event.Entity;

			object entity;
			if (obj is INHibernateProxy)
			{
				ILazyInitializer li = ((INHibernateProxy)obj).HibernateLazyInitializer;
				if (li.IsUninitialized)
				{
					if (li.Session == source)
					{
						return; //NOTE EARLY EXIT!
					}
					else
					{
						throw new PersistentObjectException("uninitialized proxy passed to persist()");
					}
				}
				entity = li.GetImplementation();
			}
			else
			{
				entity = obj;
			}

			EntityState entityState = GetEntityState(entity, @event.EntityName, source.PersistenceContext.GetEntry(entity), source);

			switch (entityState)
			{
				case EntityState.Persistent:
					EntityIsPersistent(@event, createdAlready);
					break;
				case EntityState.Transient:
					EntityIsTransient(@event, createdAlready);
					break;
				case EntityState.Detached:
					throw new PersistentObjectException("detached entity passed to persist: " + GetLoggableName(@event.EntityName, entity));
				default:
					throw new ObjectDeletedException("deleted instance passed to merge", null, GetLoggableName(@event.EntityName, entity));
			}
		}

		protected virtual void EntityIsPersistent(PersistEvent @event, IDictionary createCache)
		{
			log.Debug("ignoring persistent instance");
			IEventSource source = @event.Session;

			//TODO: check that entry.getIdentifier().equals(requestedId)
			object entity = source.PersistenceContext.Unproxy(@event.Entity);
			IEntityPersister persister = source.GetEntityPersister(entity);

			object tempObject;
			tempObject = createCache[entity];
			createCache[entity] = entity;
			if (tempObject == null)
			{
				//TODO: merge into one method!
				CascadeBeforeSave(source, persister, entity, createCache);
				CascadeAfterSave(source, persister, entity, createCache);
			}
		}

		/// <summary> Handle the given create event. </summary>
		/// <param name="event">The save event to be handled. </param>
		/// <param name="createCache"></param>
		protected virtual void EntityIsTransient(PersistEvent @event, IDictionary createCache)
		{
			log.Debug("saving transient instance");

			IEventSource source = @event.Session;
			object entity = source.PersistenceContext.Unproxy(@event.Entity);

			object tempObject;
			tempObject = createCache[entity];
			createCache[entity] = entity;
			if (tempObject == null)
			{
				SaveWithGeneratedId(entity, @event.EntityName, createCache, source, false);
			}
		}
	}
}

⌨️ 快捷键说明

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