有时ISession
会执行将ADO.NET连接状态与内存中保存的对象状态同步所需的SQL语句。默认情况下,此过程在以下几点进行刷新
- 来自
Find()
或的某些调用Enumerable()
- 从
NHibernate.ITransaction.Commit()
- 从
ISession.Flush()
SQL语句按以下顺序发出
- 所有实体插入,以相同的顺序使用
ISession.Save()
- 所有实体更新
- 所有集合删除
- 所有集合元素的删除,更新和插入
- 所有集合插入
- 所有实体删除,以相同的顺序使用
ISession.Delete()
(一个例外是,使用本机ID生成的对象在保存时会插入。)
除非您明确声明Flush()
,否则绝对不能保证Session何时执行ADO.NET调用,仅保证它们执行的顺序。但是,NHibernate确实保证这些ISession.Find(..)
方法将永远不会返回过时的数据。他们也不会返回错误的数据。
可以更改默认行为,以便减少刷新的频率。的FlushMode
类定义了三种不同的模式:仅在提交时齐平(以及NHibernate的,只有当ITransaction
使用API),自动冲水使用解释程序中,或从未冲洗除非Flush()
显式调用。最后一种模式对于长时间运行的工作单元很有用,在这种ISession
情况下,an 会长时间保持打开和断开状态。
...
结束会话涉及四个不同的阶段:
冲洗会议
如果您恰好在使用ITransaction
API,则无需担心此步骤。提交事务时将隐式执行该操作。否则,您应该致电ISession.Flush()
以确保所有更改都与数据库同步。
提交数据库事务
如果您使用的是NHibernate ITransaction API,则如下所示:
tx.Commit(); // flush the session and commit the transaction
如果您自己管理ADO.NET事务,则应手动Commit()
进行ADO.NET事务。
sess.Flush();
currentTransaction.Commit();
如果您决定不提交更改:
tx.Rollback(); // rollback the transaction
要么:
currentTransaction.Rollback();
如果回滚该事务,则应立即关闭并丢弃当前会话,以确保NHibernate的内部状态是一致的。
关闭ISession
呼叫ISession.Close()
标记会话结束。Close()的主要含义是会话将放弃ADO.NET连接。
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
如果提供了自己的连接,则Close()
返回对其的引用,以便您可以手动将其关闭或将其返回到池中。否则,Close()
将其返回到池中。