今天为了处理批量数据操作写了个简单的NHibernate helper类,支持同一事务的批量数据处理.
转载自:http://www.cnblogs.com/rayman/archive/2005/03/27/126702.aspx
using
System;
using
System.Threading;
using
System.Collections;
using
System.Collections.Specialized;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using
Nullables;
using
Nullables.NHibernate;
using
NHibernate;
using
NHibernate.Cfg;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
namespace
NHibernate.Utils
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 简单的NHibernate Helper类。支持同一事务内的批量数据处理。
/// </summary>
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public class NHHelper
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
local variables#region local variables
private NHibernate.Cfg.Configuration _cfg = null;
private ISessionFactory _sessionFactory = null;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 用于保存线程中的数据库会话。
/// </summary>
private HybridDictionary _sessionMap;
#endregion
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
singleton pattern#region singleton pattern
private static NHHelper _theInstance = null;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private NHHelper()
{
this._cfg = new NHibernate.Cfg.Configuration();
this._cfg.AddAssembly( "Entities.Assembly" );
this._sessionFactory = this._cfg.BuildSessionFactory();
this._sessionMap = new HybridDictionary();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static NHHelper Instance
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( NHHelper._theInstance == null )
{
NHHelper._theInstance = new NHHelper();
}
return NHHelper._theInstance;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
#endregion
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
transaction relax#region transaction relax
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void BeginTransaction()
{
ISession session;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( session.IsOpen )
{
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
session.BeginTransaction();
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
throw new Exception("当前不支持嵌套事务!");
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
session = this._sessionFactory.OpenSession();
session.BeginTransaction();
this._sessionMap[Thread.CurrentThread] = session;
}
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void CommitTransaction()
{
ISession session;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( session.IsOpen )
{
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
throw new Exception("当前已打开的会话或没有未提交的事务!");
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Transaction.Commit();
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch(Exception ex)
{
session.Transaction.Rollback();
throw ex;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
session.Close();
this._sessionMap.Remove( Thread.CurrentThread );
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
throw new Exception("当前已打开的会话或没有未提交的事务!");
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
throw new Exception("当前已打开的会话或没有未提交的事务!");
}
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void RollbackTransaction()
{
ISession session;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( session.IsOpen )
{
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
throw new Exception("当前已打开的会话或没有未提交的事务!");
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Transaction.Rollback();
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch(Exception ex)
{
throw ex;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
session.Close();
this._sessionMap.Remove( Thread.CurrentThread );
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
throw new Exception("当前已打开的会话或没有未提交的事务!");
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
throw new Exception("当前已打开的会话或没有未提交的事务!");
}
}
}
#endregion
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
public methods - CRUD#region public methods - CRUD
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void Add( object entity )
{
bool autoCommit = true;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ISession session;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
autoCommit = true;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
autoCommit = false;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
session = this._sessionFactory.OpenSession();
session.BeginTransaction();
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Save( entity );
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( autoCommit )
{
session.Transaction.Commit();
session.Close();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception ex)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Transaction.Rollback();
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
session.Close();
}
throw ex;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void Update( object entity, object key )
{
bool autoCommit = true;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ISession session;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
autoCommit = true;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
autoCommit = false;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
session = this._sessionFactory.OpenSession();
session.BeginTransaction();
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Update( entity, key );
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( autoCommit )
{
session.Transaction.Commit();
session.Close();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception ex)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Transaction.Rollback();
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
session.Close();
}
throw ex;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void Delete( object entity )
{
bool autoCommit = true;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ISession session;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
autoCommit = true;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
autoCommit = false;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
session = this._sessionFactory.OpenSession();
session.BeginTransaction();
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Delete( entity );
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( autoCommit )
{
session.Transaction.Commit();
session.Close();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception ex)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Transaction.Rollback();
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
session.Close();
}
throw ex;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void Save( object entity )
{
bool autoCommit = true;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ISession session;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
autoCommit = true;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
autoCommit = false;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
session = this._sessionFactory.OpenSession();
session.BeginTransaction();
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.SaveOrUpdate( entity );
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( autoCommit )
{
session.Transaction.Commit();
session.Close();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception ex)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Transaction.Rollback();
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
session.Close();
}
throw ex;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void Save( IList entities )
{
this.BeginTransaction();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
foreach( object entity in entities )
{
this.Save(entity);
}
this.CommitTransaction();
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception ex)
{
this.RollbackTransaction();
throw ex;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void Save( params object[] entities )
{
this.BeginTransaction();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
foreach( object entity in entities )
{
this.Save(entity);
}
this.CommitTransaction();
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception ex)
{
this.RollbackTransaction();
throw ex;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public object Get( Type entityType, object id )
{
object entity = null;
bool closeSession = true;
ISession session;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
if( this._sessionMap[Thread.CurrentThread] != null &&
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
((ISession)this._sessionMap[Thread.CurrentThread]).IsOpen )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
closeSession = false;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
session = this._sessionFactory.OpenSession();
closeSession = true;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
entity = session.Get( entityType, id );
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch(Exception ex)
{
closeSession = true;
throw ex;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
if( closeSession ) session.Close();
}
return entity;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
#endregion
}
}
Entity entity;
IList entityList;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//
![](https://www.cnblogs.com/Images/dot.gif)
NHHelper.Instance.Save( entity1 );
NHHelper.Instance.Get( entity.GetType(), id );
//
获得一个对象实例
NHHelper.Instance.BeginTransaction();
//
启动事务
NHHelper.Instance.Add( entity );
//
增加一个对象
NHHelper.Instance.Update( entity, entity.ID );
//
更新一个对象
NHHelper.Instance.Delete( entity );
//
删除一个对象
NHHelper.Instance.Save( entity );
//
增加或更新一个对象
NHHelper.Instance.CommitTransaction();
//
提交事务
NHHelper.Instance.Save( entity2, entity3, entity4, entity5 );
//
增加或更新多个对象,对象类型不用相同
NHHelper.Instance.Save( entityList );
//
增加或更新列表里的所有对象,对象类型不用相同