Click here to Skip to main content
15,881,866 members
Articles / Programming Languages / XML

Building a Middle Tier Component using NHibernate and Spring.NET

Rate me:
Please Sign up or sign in to vote.
4.50/5 (21 votes)
10 May 2006CPOL8 min read 158.3K   2.4K   109  
Building a highly pluggable middle-tier component with NHibernate and Spring.Net.
#region License

 /*
 * Copyright � 2002-2005 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#endregion

#region Imports

using System;
using System.Diagnostics;
using System.Reflection;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Type;
using Spring.Objects.Factory;
using log4net;
using System.Collections;
using System.Collections.Specialized;
#endregion

namespace Spring.Orm.Hibernate
{
	 /// <summary>
	 /// Helper class that simplifies Hibernate data access code.
	 ///
	 /// <p>Typically used to implement data access or business logic services that
	 /// use Hibernate within their implementation but are Hibernate-agnostic in their
	 /// interface. The latter or code calling the latter only have to deal with
	 /// domain objects, query objects.</p>
	 ///
	 /// <p>The central method is "Execute", supporting Hibernate code implementing
	 /// the IHibernateCallback interface. It provides Hibernate Session handling
	 /// such that neither the IHibernateCallback implementation nor the calling
	 /// code needs to explicitly care about retrieving/closing Hibernate Sessions,
	 /// or handling Session lifecycle exceptions. For typical single step actions,
	 /// there are various convenience methods (find, load, saveOrUpdate, delete).</p>
	 ///
	 /// <p>Can be used within a service implementation via direct instantiation
	 /// with a SessionFactory reference, or get prepared in an application context
	 /// and given to services as bean reference. Note: The SessionFactory should
	 /// always be configured as bean in the application context, in the first case
	 /// given to the service directly, in the second case to the prepared template.</p>
	 ///
	 ///
	 /// <p>Note that even if HibernateTransactionManager is used for transaction
	 /// demarcation in higher-level services, all those services above the data
	 /// access layer don't need need to be Hibernate-aware. Setting such a special
	 /// PlatformTransactionManager is a configuration issue.</p>
	 ///
	 /// <p>LocalSessionFactoryBean is the preferred way of obtaining a reference
	 /// to a specific Hibernate SessionFactory.</p>
	 ///	
	 ///
	 ///
	 /// <author> Juergen Hoeller </author>
	 /// <author> Moim Hossain (.NET) </author>
	 /// </summary>
	public class HibernateTemplate : HibernateAccessor , IHibernateOperations
	{
		/// <summary>
		/// Alow Create a new Session
		/// </summary>
		private bool allowCreate = true;
		/// <summary>
		/// If Always create a new Session
		/// </summary>
		private bool alwaysUseNewSession = false;
		/// <summary>
		/// Expose the Native Session
		/// </summary>
		private bool exposeNativeSession = false;
		/// <summary>
		/// Allow Write Operation
		/// </summary>
		private bool checkWriteOperations = true;
		/// <summary>
		/// Cache Query ?
		/// </summary>
		private bool cacheQueries = false;
		/// <summary>
		/// The Region
		/// </summary>
		private String queryCacheRegion;
		/// <summary>
		/// No Args Constructor
		/// </summary>
		public HibernateTemplate()
		{

		}
		/// <summary>
		/// The Constructor
		/// </summary>
		/// <param name="sessionFactory">The <see cref="NHibernate.ISessionFactory"/> Instance</param>
		public HibernateTemplate(ISessionFactory sessionFactory)
		{
			this.SessionFactory = sessionFactory;

			AfterPropertiesSet();
		}
		/// <summary>
		/// Create a new HibernateTemplate instance.
		/// <params> sessionFactory SessionFactory to create Sessions </params>
		/// <params> allowCreate if a new Session should be created if no thread-bound found </params>
		/// </summary>
		public HibernateTemplate(ISessionFactory sessionFactory, bool allowCreate) 
		{
			this.SessionFactory = sessionFactory;
			
			SetAllowCreate( allowCreate );
			
			AfterPropertiesSet();
		}
		/// <summary>
		/// Set if a new Session should be created if no thread-bound found.
		/// <p>HibernateTemplate is aware of a respective Session bound to the
		/// current thread, for example when using HibernateTransactionManager.</p>
		/// If allowCreate is true, a new Session will be created if none found.
		/// If false, an IllegalStateException will get thrown in this case.				
		/// </summary>
		public void SetAllowCreate(bool allowCreate) 
		{
			this.allowCreate = allowCreate;
		}
		/// <summary>
		/// Return if a new Session should be created if no thread-bound found.
		/// </summary>
		public bool IsAllowCreate() 
		{
			return allowCreate;
		}
		/// <summary>
		/// Set whether to always use a new Hibernate Session for this template.
		/// Default is false; if activated, all operations on this template will
		/// work on a new Hibernate Session even in case of a pre-bound Session
		/// (for example, within a transaction or OpenSessionInViewFilter).
		/// <p>Within a transaction, a new Hibernate Session used by this template
		/// will participate in the transaction through using the same 
		/// Connection. In such a scenario, multiple Sessions will participate
		/// in the same database transaction. </p>
		/// <p>Turn this on for operations that are supposed to always execute
		/// independently, without side effects caused by a shared Hibernate
		/// Session.</p>
		/// </summary>
		public void SetAlwaysUseNewSession(bool alwaysUseNewSession) 
		{
			this.alwaysUseNewSession = alwaysUseNewSession;
		}
		/// <summary>
		/// Return whether to always use a new Hibernate Session for this template.
		/// </summary>
		public bool IsAlwaysUseNewSession() 
		{
			return alwaysUseNewSession;
		}
		/// <summary>
		/// Set whether to expose the native Hibernate Session to IHibernateCallback
		/// code. Default is false; instead, a Session proxy will be returned,
		/// suppressing <code>close</code> calls and automatically applying
		/// query cache settings and transaction timeouts.
		/// </summary>
		public void SetExposeNativeSession(bool exposeNativeSession) 
		{
			this.exposeNativeSession = exposeNativeSession;
		}
		/// <summary>
		/// Return whether to expose the native Hibernate Session to HibernateCallback
		/// code, or rather a Session proxy.
		/// </summary>
		public bool IsExposeNativeSession() 
		{
			return exposeNativeSession;
		}
		/// <summary>
		/// Set whether to check that the Hibernate Session is not in read-only mode
		/// in case of write operations (save/update/delete).
		/// <p>Default is true, for fail-fast behavior when attempting write operations
		/// within a read-only transaction. Turn this off to allow save/update/delete
		/// on a Session with flush mode NEVER.</p>		
		/// </summary>
		public void SetCheckWriteOperations(bool checkWriteOperations) 
		{
			this.checkWriteOperations = checkWriteOperations;
		}
		/// <summary>
		/// Return whether to check that the Hibernate Session is not in read-only
		/// mode in case of write operations (save/update/delete).
		/// </summary>
		public bool IsCheckWriteOperations() 
		{
			return checkWriteOperations;
		}
		/// <summary>
		/// Set whether to cache all queries executed by this template.
		/// If this is true, all Query and Criteria objects created by
		/// this template will be marked as cacheable (including all
		/// queries through find methods).
		/// <p>To specify the query region to be used for queries cached
		/// by this template, set the "queryCacheRegion" property.		
		/// <param name="cacheQueries"></param>
		/// </summary>	
		public void SetCacheQueries(bool cacheQueries) 
		{
			this.cacheQueries = cacheQueries;
		}
		/// <summary>
		/// Return whether to cache all queries executed by this template.
		/// </summary>
		public bool IsCacheQueries() 
		{
			return cacheQueries;
		}
		/// <summary>
		/// Set the name of the cache region for queries executed by this template.
		/// If this is specified, it will be applied to all Query and Criteria objects
		/// created by this template (including all queries through find methods).
		/// <p>The cache region will not take effect unless queries created by this
		/// template are configured to be cached via the "cacheQueries" property.</p>
		/// 
		/// </summary>
		public void SetQueryCacheRegion(String queryCacheRegion) 
		{
			this.queryCacheRegion = queryCacheRegion;
		}
		/// <summary>
		/// Return the name of the cache region for queries executed by this template.
		/// </summary>
		public String GetQueryCacheRegion() 
		{
			return queryCacheRegion;
		}
		/// <summary>
		/// Prepare the given Criteria object, applying cache settings and/or
		/// a transaction timeout.
		/// <param name="criteria"> criteria the Criteria object to prepare</params>
		/// </summary>
		public void PrepareCriteria(ICriteria criteria) 
		{
			if (IsCacheQueries()) 
			{
				criteria.SetCacheable(true);
				if (GetQueryCacheRegion() != null) 
				{
					criteria.SetCacheRegion(GetQueryCacheRegion());
				}
			}
		}
		/// <summary>
		/// Prepare the given Query object, applying cache settings and/or
		/// a transaction timeout.
		/// <param name="queryObject">the Query object to prepare </param>
		/// </summary>
		public void PrepareQuery(IQuery queryObject) 
		{
			if (IsCacheQueries()) 
			{
				queryObject.SetCacheable(true);
				if (GetQueryCacheRegion() != null) 
				{
					queryObject.SetCacheRegion(GetQueryCacheRegion());
				}
			}
		}
		/// <summary>
		/// Execute the action specified by the given action object within a Session.
		/// <param name="action">callback object that specifies the Hibernate action</param>
		/// <param name="exposeNativeSession">whether to expose the native Hibernate Session</param>
		/// <returns>a result object returned by the action, or null</returns>
		/// </summary>
		public Object Execute(IHibernateCallback action, bool exposeNativeSession)
		{
			ISession session = GetSession();

			try 
			{
				ISession sessionToExpose = (exposeNativeSession ? session : CreateSessionProxy(session));
				
				Object result = action.DoInHibernate(sessionToExpose);

				FlushIfNecessary(session, true);// Is it true or false

				return result;
			}
			catch (HibernateException ex) 
			{
				throw new ApplicationException( "Hibernate Error." , ex );
			}
			catch (Exception ex) 
			{
				throw ex;
			}
			finally 
			{
				SessionFactoryUtils.CloseSessionIfNecessary(session, SessionFactory );
			}
		}
		/// <summary>
		/// Return a Session for use by this template.
		/// <p>Returns a new Session in case of "AlwaysUseNewSession" , 
		/// if applicable), a pre-bound
		/// Session in case of "allowCreate" turned off, and a pre-bound or new Session
		/// else (new only if no transactional or otherwise pre-bound Session exists).	</p>
		/// </summary>
		protected ISession GetSession() 
		{
			if (IsAlwaysUseNewSession()) 
			{
				return SessionFactoryUtils.GetNewSession( SessionFactory , EntityInterceptor );
			}
			else if (!IsAllowCreate()) 
			{
				return SessionFactoryUtils.GetSession( SessionFactory , false );
			}
			else 
			{
				return SessionFactoryUtils.GetSession(SessionFactory , EntityInterceptor );
			}
		}
		/// <summary>
		/// Create a close-suppressing proxy for the given Hibernate Session.
		/// The proxy also prepares returned Query and Criteria objects.
		/// <param name="session">the Hibernate Session to create a proxy for</param>
		/// <returns>the Session proxy</returns>
		/// </summary>
		protected ISession CreateSessionProxy(ISession session) 
		{
//			return (ISession) Proxy.newProxyInstance(
//				getClass().getClassLoader(),
//				new Class[] {Session.class},
//			new CloseSuppressingInvocationHandler(session));
			return session;
		}
		/// <summary>
		/// Check whether write operations are allowed on the given Session.
		/// <p>Default implementation throws an InvalidDataAccessApiUsageException
		/// in case of FlushMode.NEVER. Can be overridden in subclasses.</p>
		/// <param name="session">current Hibernate Session</param>
		/// </summary>
		public void CheckWriteOperationAllowed(ISession session) 
		{
			if (IsCheckWriteOperations() && FlushMode != FLUSH_EAGER &&
				NHibernate.FlushMode.Never.Equals(session.FlushMode) ) 
			{
				throw new ApplicationException(
					"Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session " +
					"into FlushMode.AUTO or remove 'readOnly' marker from transaction definition");
			}
		}

		#region IHibernateOperations Members
		/// <summary>
		/// The Execute Method
		/// </summary>
		/// <param name="action">The Callback Reference</param>
		/// <returns>The Result Object</returns>
		public Object Execute(IHibernateCallback action)
		{
			return Execute( action , IsExposeNativeSession() );
		}
		/// <summary>
		/// Execute the Find Operation
		/// </summary>
		/// <param name="action"></param>
		/// <returns></returns>
		public IList ExecuteFind(IHibernateCallback action)
		{
			return (IList) Execute( action, IsExposeNativeSession());
		}
		/// <summary>
		/// Retrive the Entity By ID 
		/// </summary>
		/// <param name="entityClass">The <see cref="System.Type"/> instance</param>
		/// <param name="id">The ID of the Instance</param>
		/// <returns>The Result Object</returns>
		public Object Get(Type entityClass, Object id)
		{
			return Get(entityClass, id, null);
		}
		/// <summary>
		/// Retrive the Entity
		/// </summary>
		/// <param name="entityClass">The <see cref="System.Type"/> instance </param>
		/// <param name="id">The ID of the Instance</param>
		/// <param name="lockMode">The Lock Mode</param>
		/// <returns>The Result Object</returns>
		public Object Get(Type entityClass, Object id, LockMode lockMode)
		{
			return Execute( new GetHibernetCallBack(entityClass,id,lockMode) , true );
		}		
		/// <summary>
		/// Load a Entity
		/// </summary>
		/// <param name="entityClass">The <see cref="System.Type"/> instance</param>
		/// <param name="id">The Entity ID</param>
		/// <returns>The Result Object</returns>
		public Object Load(Type entityClass, Object id)
		{
			return Load(entityClass, id, null);
		}
		/// <summary>
		/// Load an Entity
		/// </summary>
		/// <param name="entityClass">The <see cref="System.Type"/> instance</param>
		/// <param name="id">The Entity ID</param>
		/// <param name="lockMode">The Lock Mode</param>
		/// <returns>The Result Object</returns>
		public Object Load(Type entityClass, Object id, LockMode lockMode)
		{
			return Execute( new LoadHibernetCallBack( entityClass , id , lockMode ) , true );
		}
		/// <summary>
		/// Load All Entity
		/// </summary>
		/// <param name="entityClass">The <see cref="System.Type"/> instance</param>
		/// <returns>The <see cref="System.Collection.IList"/> instance</returns>
		public IList LoadAll(Type entityClass)
		{
			return Execute( new LoadAllHibernetCallBack( entityClass , this ) , true ) as IList;
		}
		/// <summary>
		/// Load Entity By ID into the entity
		/// </summary>
		/// <param name="entity">The Entity Object that will be filled with the retrive Data</param>
		/// <param name="id">The Enetity ID</param>
		public void Load(Object entity, Object id)
		{
			Execute( new LoadObjectHibernetCallBack( entity , id ), true );
		}
		/// <summary>
		/// Refresh the Entity for the Session
		/// </summary>
		/// <param name="entity"></param>
		public void Refresh(Object entity)
		{
			Refresh(entity, null);
		}
		/// <summary>
		/// Refresh Entity by Locking 
		/// </summary>
		/// <param name="entity">The Entity to Refersh</param>
		/// <param name="lockMode">The Lock Mode</param>
		public void Refresh(Object entity, LockMode lockMode)
		{
			Execute( new RefreshHibernetCallBack( entity , lockMode ), true );
		}
		/// <summary>
		/// Check it the Entity Contains into the Session
		/// </summary>
		/// <param name="entity">The Entity</param>
		/// <returns>true if exists, false other wise</returns>
		public bool Contains(Object entity)
		{
			return (bool)Execute( new ContainsObjectHibernetCallBack( entity ) , true );
		}
		/// <summary>
		/// Evict the Entity from the session
		/// </summary>
		/// <param name="entity">The Entity</param>
		public void Evict(Object entity)
		{
			Execute( new EvictObjectHibernetCallBack( entity ) , true );
		}
		/// <summary>
		/// Initialize.
		/// </summary>
		/// <param name="proxy">The Proxy Instance</param>
		public void Initialize(Object proxy)
		{
			try 
			{
				NHibernateUtil.Initialize( proxy );
			}
			catch (HibernateException ex) 
			{
				throw new ApplicationException("Error initializing...",ex);
			}
		}
		//-------------------------------------------------------------------------
		// Convenience methods for storing individual objects
		//-------------------------------------------------------------------------
		/// <summary>
		/// Lock the Entity
		/// </summary>
		/// <param name="entity">The Entity</param>
		/// <param name="lockMode">The Lock Mode</param>
		public void Lock(Object entity, LockMode lockMode)
		{
			Execute( new LockHibernetCallBack( entity , lockMode ),true);
		}
		/// <summary>
		/// Save a entity
		/// </summary>
		/// <param name="entity">The Entity</param>
		/// <returns>The ID of the Entity</returns>
		public Object Save(Object entity)
		{
			return Execute( new SaveHibernetCallBack( entity , this ), true );
		}
		/// <summary>
		/// Save the Entity with the ID
		/// </summary>
		/// <param name="entity">The Entity</param>
		/// <param name="id">The ID</param>
		public void Save(Object entity, Object id)
		{
			Execute( new SaveWithIDHibernetCallBack( entity , id , this ) , true );
		}
		/// <summary>
		/// Update
		/// </summary>
		/// <param name="entity">The Entity</param>
		public void Update(Object entity)
		{
			Update(entity, null);
		}
		/// <summary>
		/// Update
		/// </summary>
		/// <param name="entity"></param>
		/// <param name="lockMode"></param>
		public void Update(Object entity, LockMode lockMode)
		{
			Execute( new UpdateHibernetCallBack( entity , lockMode , this ), true );
		}
		/// <summary>
		/// Save or Update
		/// </summary>
		/// <param name="entity"></param>
		public void SaveOrUpdate(Object entity)
		{
			Execute( new SaveOrUpdateHibernetCallBack( entity , this ) , true );
		}
		/// <summary>
		/// Save or Update All Entities into the collection
		/// </summary>
		/// <param name="entities"></param>
		public void SaveOrUpdateAll(ICollection entities)
		{
			// NOT IMPLEMENTING NOW
		}
		/// <summary>
		/// Save or Update the Copy
		/// </summary>
		/// <param name="entity"></param>
		/// <returns></returns>
		public Object SaveOrUpdateCopy(Object entity)
		{
			 return Execute( new SaveOrUpdateCopyHibernetCallBack( entity , this ), true );
		}
		/// <summary>
		/// Delete the Entity
		/// </summary>
		/// <param name="entity"></param>
		public void Delete(Object entity)
		{
			Delete(entity, null);
		}
		/// <summary>
		/// Delete with Locking
		/// </summary>
		/// <param name="entity"></param>
		/// <param name="lockMode"></param>
		public void Delete(Object entity, LockMode lockMode)
		{
			Execute( new DeleteHibernetCallBack( entity , lockMode , this ), true );
		}
		/// <summary>
		/// Delete All
		/// </summary>
		/// <param name="entities"></param>
		public void DeleteAll(ICollection entities)
		{
			for( IEnumerator enumerator = entities.GetEnumerator(); enumerator.MoveNext(); )
			{	// Iterate over the collection and delete each item from the collection
				Delete( enumerator.Current );
			}
		}
		/// <summary>
		/// Flush the Session
		/// </summary>
		public void Flush()
		{
			Execute( new FlushHibernetCallBack( ) , true );
		}
		/// <summary>
		/// Clear
		/// </summary>
		public void Clear()
		{
			Execute( new ClearHibernetCallBack() , true );
		}
		/// <summary>
		/// Finds and returns the <see cref="System.Collection.IList"/> instance
		/// </summary>
		/// <param name="queryString">The Query String</param>
		/// <returns> The <see cref="System.Collection.IList"/> instance </returns>
		public IList Find(String queryString)
		{
			return Find( queryString , (Object[])null , (IType[])null );
		}
		/// <summary>
		/// Find
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="value"></param>
		/// <returns></returns>
		public IList Find(String queryString, Object value)
		{
			return Find( queryString , new object[]{value} , (IType[])null );
		}
		/// <summary>
		/// Find
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="value"></param>
		/// <param name="type"></param>
		/// <returns></returns>
		public IList Find(String queryString, Object value, IType type)
		{
			return Find( queryString , new object[]{value} , new IType[]{type} );
		}
		/// <summary>
		/// Find
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="values"></param>
		/// <returns></returns>
		public IList Find(String queryString, Object[] values)
		{
			return Find( queryString , values , (IType[])null );
		}
		/// <summary>
		/// Find
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="values"></param>
		/// <param name="types"></param>
		/// <returns></returns>
		public IList Find(String queryString, Object[] values, IType[] types)
		{
			if( null != values && null != types && values.Length != types.Length )
			{
				throw new ArgumentException("Values and types length must be equal.","Values and Types");
			}
			return Execute( new FindAllHibernetCallBack( queryString , values , types , this ) , true ) as IList;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryName"></param>
		/// <param name="paramName"></param>
		/// <param name="value"></param>
		/// <returns></returns>
		public IList FindByNamedParam(String queryName, String paramName, Object value)
		{
			// TODO:  Add HibernateTemplate.FindByNamedParam implementation
			return null;
		}
		/// <summary>
		/// Find By Name
		/// </summary>
		/// <param name="queryName"></param>
		/// <param name="paramName"></param>
		/// <param name="value"></param>
		/// <param name="type"></param>
		/// <returns></returns>
		public IList FindByNamedParam(String queryName, String paramName, Object value, IType type)
		{
			// TODO:  Add HibernateTemplate.FindByNamedParam implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="paramNames"></param>
		/// <param name="values"></param>
		/// <returns></returns>
		public IList FindByNamedParam(String queryString, String[] paramNames, Object[] values)
		{
			// TODO:  Add HibernateTemplate.FindByNamedParam implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="paramNames"></param>
		/// <param name="values"></param>
		/// <param name="types"></param>
		/// <returns></returns>
		public IList FindByNamedParam(String queryString, String[] paramNames, Object[] values, IType[] types)
		{
			// TODO:  Add HibernateTemplate.FindByNamedParam implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="valueBean"></param>
		/// <returns></returns>
		public IList FindByValueObject(String queryString, Object valueBean)
		{
			// TODO:  Add HibernateTemplate.FindByValueBean implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryName"></param>
		/// <returns></returns>
		public IList FindByNamedQuery(String queryName)
		{
			// TODO:  Add HibernateTemplate.FindByNamedQuery implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryName"></param>
		/// <param name="value"></param>
		/// <returns></returns>
		public IList FindByNamedQuery(String queryName, Object value)
		{
			// TODO:  Add HibernateTemplate.FindByNamedQuery implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryName"></param>
		/// <param name="value"></param>
		/// <param name="type"></param>
		/// <returns></returns>
		public IList FindByNamedQuery(String queryName, Object value, IType type)
		{
			// TODO:  Add HibernateTemplate.FindByNamedQuery implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryName"></param>
		/// <param name="values"></param>
		/// <returns></returns>
		public IList FindByNamedQuery(String queryName, Object[] values)
		{
			// TODO:  Add HibernateTemplate.FindByNamedQuery implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryName"></param>
		/// <param name="values"></param>
		/// <param name="types"></param>
		/// <returns></returns>
		public IList FindByNamedQuery(String queryName, Object[] values, IType[] types)
		{
			// TODO:  Add HibernateTemplate.FindByNamedQuery implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryName"></param>
		/// <param name="paramName"></param>
		/// <param name="value"></param>
		/// <returns></returns>
		public IList FindByNamedQueryAndNamedParam(String queryName, String paramName, Object value)
		{
			// TODO:  Add HibernateTemplate.FindByNamedQueryAndNamedParam implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryName"></param>
		/// <param name="paramName"></param>
		/// <param name="value"></param>
		/// <param name="type"></param>
		/// <returns></returns>
		public IList FindByNamedQueryAndNamedParam(String queryName, String paramName, Object value, IType type)
		{
			// TODO:  Add HibernateTemplate.FindByNamedQueryAndNamedParam implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryName"></param>
		/// <param name="paramNames"></param>
		/// <param name="values"></param>
		/// <returns></returns>
		public IList FindByNamedQueryAndNamedParam(String queryName, String[] paramNames, Object[] values)
		{
			// TODO:  Add HibernateTemplate.FindByNamedQueryAndNamedParam implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryName"></param>
		/// <param name="paramNames"></param>
		/// <param name="values"></param>
		/// <param name="types"></param>
		/// <returns></returns>
		public IList FindByNamedQueryAndNamedParam(String queryName, String[] paramNames, Object[] values, IType[] types)
		{
			// TODO:  Add HibernateTemplate.FindByNamedQueryAndNamedParam implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryName"></param>
		/// <param name="valueBean"></param>
		/// <returns></returns>
		public IList FindByNamedQueryAndValueBean(String queryName, Object valueBean)
		{
			// TODO:  Add HibernateTemplate.FindByNamedQueryAndValueBean implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryString"></param>
		/// <returns></returns>
		public IEnumerator Enumerate(String queryString)
		{
			// TODO:  Add HibernateTemplate.Enumerate implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="value"></param>
		/// <returns></returns>
		public IEnumerator Enumerate(String queryString, Object value)
		{
			// TODO:  Add HibernateTemplate.Enumerate implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="value"></param>
		/// <param name="type"></param>
		/// <returns></returns>
		public IEnumerator Enumerate(String queryString, Object value, IType type)
		{
			// TODO:  Add HibernateTemplate.Enumerate implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="values"></param>
		/// <returns></returns>
		public IEnumerator Enumerate(String queryString, Object[] values)
		{
			// TODO:  Add HibernateTemplate.Enumerate implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="values"></param>
		/// <param name="types"></param>
		/// <returns></returns>
		public IEnumerator Enumerate(String queryString, Object[] values, IType[] types)
		{
			// TODO:  Add HibernateTemplate.Enumerate implementation
			return null;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="enumerator"></param>
		public void CloseEnumerator(IEnumerator enumerator)
		{
			// TODO:  Add HibernateTemplate.CloseEnumerator implementation
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryString"></param>
		/// <returns></returns>
		public int Delete(String queryString)
		{
			// TODO:  Add HibernateTemplate.Delete implementation
			return 0;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="value"></param>
		/// <param name="type"></param>
		/// <returns></returns>
		public int Delete(String queryString, Object value, IType type)
		{
			// TODO:  Add HibernateTemplate.Delete implementation
			return 0;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="queryString"></param>
		/// <param name="values"></param>
		/// <param name="types"></param>
		/// <returns></returns>
		public int Delete(String queryString, Object[] values, IType[] types)
		{
			// TODO:  Add HibernateTemplate.Delete implementation
			return 0;
		}

		#endregion

		#region Inner Classes Implementations
		/// <summary>
		/// Call back for GET
		/// </summary>
		public class GetHibernetCallBack : IHibernateCallback
		{
			public GetHibernetCallBack( Type entityClass, Object id, LockMode lockMode )
			{
				m_entityClass = entityClass;

				m_id = id;

				m_lockMode = lockMode;
			}

			private Type m_entityClass;
			private Object m_id;
			private LockMode m_lockMode;

			#region IHibernateCallback Members

			public Object DoInHibernate(ISession session)
			{
				if ( m_lockMode != null ) 
				{
					return session.Get( m_entityClass, m_id, m_lockMode);
				}
				else 
				{
					return session.Get( m_entityClass, m_id);
				}
			}

			#endregion
		}
		/// <summary>
		/// Call back for REFRESH
		/// </summary>
		public class RefreshHibernetCallBack : IHibernateCallback
		{
			public RefreshHibernetCallBack( Object entity, LockMode lockMode )
			{
				m_entity = entity;

				m_lockMode = lockMode;
			}

			private Object m_entity;

			private LockMode m_lockMode;

			#region IHibernateCallback Members

			public Object DoInHibernate(ISession session)
			{
				if ( m_lockMode != null ) 
				{
					session.Refresh( m_entity, m_lockMode);
				}
				else 
				{
					session.Refresh( m_entity, m_lockMode);
				}
				return null;
			}

			#endregion
		}
		/// <summary>
		/// Call back for LOAD
		/// </summary>
		public class LoadHibernetCallBack : IHibernateCallback
		{
			public LoadHibernetCallBack( Type entityClass, Object id, LockMode lockMode )
			{
				m_entityClass = entityClass;

				m_id = id;

				m_lockMode = lockMode;
			}

			private Type m_entityClass;
			private Object m_id;
			private LockMode m_lockMode;

			#region IHibernateCallback Members

			public Object DoInHibernate(ISession session)
			{
				if ( m_lockMode != null ) 
				{
					return session.Load( m_entityClass, m_id, m_lockMode);
				}
				else 
				{
					return session.Load( m_entityClass, m_id);
				}
			}

			#endregion
		}
		/// <summary>
		/// Call back for LOAD
		/// </summary>
		public class LoadObjectHibernetCallBack : IHibernateCallback
		{
			public LoadObjectHibernetCallBack( Object entity , Object id )
			{
				m_entity = entity;

				m_id = id;
			}

			private Object m_entity;
			private Object m_id;
		

			#region IHibernateCallback Members	
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				session.Load( m_entity, m_id );
				return null;
			}

			#endregion
		}
		/// <summary>
		/// Call back for LOAD
		/// </summary>
		public class LoadAllHibernetCallBack : IHibernateCallback
		{
			public LoadAllHibernetCallBack( Type entityClass , HibernateTemplate Template )
			{
				m_entityClass = entityClass;

				m_HibernateTemplate = Template;
			}

			private Type m_entityClass;

			private HibernateTemplate m_HibernateTemplate;
		
			#region IHibernateCallback Members
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				ICriteria criteria = session.CreateCriteria(m_entityClass);
			
				m_HibernateTemplate. PrepareCriteria(criteria);

				return criteria.List();
			}

			#endregion
		}
		/// <summary>
		/// Call back for CONTAINS
		/// </summary>
		public class ContainsObjectHibernetCallBack : IHibernateCallback
		{
			public ContainsObjectHibernetCallBack( Object entity )
			{
				m_entity = entity;
			}

			private Object m_entity;
		

			#region IHibernateCallback Members	
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				return session.Contains( m_entity );			
			}

			#endregion
		}
		/// <summary>
		/// Call back for EVICT
		/// </summary>
		public class EvictObjectHibernetCallBack : IHibernateCallback
		{
			public EvictObjectHibernetCallBack( Object entity )
			{
				m_entity = entity;
			}

			private Object m_entity;
		

			#region IHibernateCallback Members	
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				session.Evict( m_entity );			
				return null;
			}

			#endregion
		}
		/// <summary>
		/// Call back for LOCK
		/// </summary>
		public class LockHibernetCallBack : IHibernateCallback
		{
			public LockHibernetCallBack( Object entity, LockMode lockMode )
			{
				m_entity = entity;

				m_lockMode = lockMode;
			}

			private Object m_entity;
		
			private LockMode m_lockMode;

			#region IHibernateCallback Members
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				session.Lock( m_entity , m_lockMode );
				return null;
			}

			#endregion
		}
		/// <summary>
		/// Call back for SAVEWithID
		/// </summary>
		public class SaveWithIDHibernetCallBack : IHibernateCallback
		{
			public SaveWithIDHibernetCallBack( Object entity , Object id , HibernateTemplate template)
			{
				m_entity = entity;

				m_HibernateTemplate = template;

				m_id = id;
			}

			private Object m_entity;

			private Object m_id;

			private HibernateTemplate m_HibernateTemplate;

			#region IHibernateCallback Members
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				m_HibernateTemplate.CheckWriteOperationAllowed( session );

				session.Save( m_entity , m_id );

				return null;
			}

			#endregion
		}
		/// <summary>
		/// Call back for SAVE
		/// </summary>
		public class SaveHibernetCallBack : IHibernateCallback
		{
			public SaveHibernetCallBack( Object entity , HibernateTemplate template)
			{
				m_entity = entity;

				m_HibernateTemplate = template;
			}

			private Object m_entity;

			private HibernateTemplate m_HibernateTemplate;

			#region IHibernateCallback Members
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				m_HibernateTemplate.CheckWriteOperationAllowed( session );

				return session.Save( m_entity );
			}

			#endregion
		}
		/// <summary>
		/// Call back for UPDATE
		/// </summary>
		public class UpdateHibernetCallBack : IHibernateCallback
		{
			public UpdateHibernetCallBack( Object entity , LockMode lockMode , HibernateTemplate template)
			{
				m_entity = entity;

				m_LockMode = lockMode;

				m_HibernateTemplate = template;
			}

			private Object m_entity;

			private LockMode m_LockMode;

			private HibernateTemplate m_HibernateTemplate;

			#region IHibernateCallback Members
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				m_HibernateTemplate.CheckWriteOperationAllowed( session );

				session.Update( m_entity );

				if( null != m_LockMode )
				{
					session.Lock( m_entity , m_LockMode );
				}
				return null;
			}

			#endregion
		}
		/// <summary>
		/// Call back for SAVEorUpdate
		/// </summary>
		public class SaveOrUpdateHibernetCallBack : IHibernateCallback
		{
			public SaveOrUpdateHibernetCallBack( Object entity , HibernateTemplate template)
			{
				m_entity = entity;

				m_HibernateTemplate = template;
			}

			private Object m_entity;

			private HibernateTemplate m_HibernateTemplate;

			#region IHibernateCallback Members
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				m_HibernateTemplate.CheckWriteOperationAllowed( session );

				session.SaveOrUpdate( m_entity );

				return null;
			}

			#endregion
		}
		/// <summary>
		/// Call back for SAVEorUpdate Copy
		/// </summary>
		public class SaveOrUpdateCopyHibernetCallBack : IHibernateCallback
		{
			public SaveOrUpdateCopyHibernetCallBack( Object entity , HibernateTemplate template)
			{
				m_entity = entity;

				m_HibernateTemplate = template;
			}

			private Object m_entity;

			private HibernateTemplate m_HibernateTemplate;

			#region IHibernateCallback Members
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				m_HibernateTemplate.CheckWriteOperationAllowed( session );

				return session.SaveOrUpdateCopy( m_entity );
			}

			#endregion
		}
		/// <summary>
		/// Call back for DELETE
		/// </summary>
		public class DeleteHibernetCallBack : IHibernateCallback
		{
			public DeleteHibernetCallBack( Object entity , LockMode lockMode , HibernateTemplate template)
			{
				m_entity = entity;

				m_LockMode = lockMode;

				m_HibernateTemplate = template;
			}

			private Object m_entity;

			private LockMode m_LockMode;

			private HibernateTemplate m_HibernateTemplate;

			#region IHibernateCallback Members
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				m_HibernateTemplate.CheckWriteOperationAllowed( session );

				if( null != m_LockMode )
				{
					session.Lock( m_entity , m_LockMode );
				}

				session.Delete( m_entity );			
				return null;
			}

			#endregion
		}
		/// <summary>
		/// Call back for FLUSH
		/// </summary>
		public class FlushHibernetCallBack : IHibernateCallback
		{
			public FlushHibernetCallBack( )
			{
			
			}


			#region IHibernateCallback Members
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				session.Flush();
				return null;
			}

			#endregion
		}
		/// <summary>
		/// Call back for CLEAR
		/// </summary>
		public class ClearHibernetCallBack : IHibernateCallback
		{
			public ClearHibernetCallBack( )
			{
			
			}


			#region IHibernateCallback Members
			/// <summary>
			/// 
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				session.Clear();
				return null;
			}

			#endregion
		}
		/// <summary>
		/// Call back for Find
		/// </summary>
		public class FindAllHibernetCallBack : IHibernateCallback
		{
			public FindAllHibernetCallBack( string QueryString , object[]Values , IType[]Types , HibernateTemplate Template )
			{
				m_queryString = QueryString;

				m_values = Values;

				m_types = Types;

				m_HibernateTemplate = Template;
			}

			private string m_queryString;

			private object[]m_values;

			private IType[]m_types;

			private HibernateTemplate m_HibernateTemplate;
		
			#region IHibernateCallback Members
			/// <summary>
			/// CallBack for Find Method
			/// </summary>
			/// <param name="session"></param>
			/// <returns></returns>
			public Object DoInHibernate(ISession session)
			{
				IQuery queryObject = session.CreateQuery( m_queryString );

				m_HibernateTemplate.PrepareQuery( queryObject );

				if ( m_values != null ) 
				{
					for (int i = 0; i < m_values.Length; i++) 
					{
						if ( m_types != null && m_types[i] != null) 
						{
							queryObject.SetParameter( i, m_values[i], m_types[i]);
						}
						else 
						{
							queryObject.SetParameter( i, m_values[i]);
						}
					}
				}
				return queryObject.List();
			}

			#endregion
		}
		#endregion
	}
	
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect
Netherlands Netherlands
Engineer Powered by the Cloud

Comments and Discussions