间隔一段时间,ISession
将执行必要的 SQL 语句,以使 ADO.NET 连接状态与内存中持有的对象状态同步。默认情况下,此进程(刷新)在以下几点发生:
- 从某些
Find()
或 Enumerable()
调用中
- 从
NHibernate.ITransaction.Commit()
中
- 从
ISession.Flush()
中
SQL 语句的发出顺序如下:
- 所有实体插入,在相应的对象使用
ISession.Save()
保存时的相同顺序中
- 所有实体更新
- 所有集合删除
- 所有集合元素的删除、更新和插入
- 所有集合插入
- 所有实体删除,在相应的对象使用
ISession.Delete()
删除时的相同顺序中
(一个例外是使用原生 ID 生成的对象在保存时插入。)
除非您显式调用 Flush()
,否则无法保证会话何时执行 ADO.NET 调用,只保证它们被执行的顺序。然而,NHibernate 确保 ISession.Find(..)
方法永远不会返回过期数据;它们也不会返回错误数据。
可以更改默认行为,以便刷新发生得更少。FlushMode 类定义了三种不同的模式:仅在提交时刷新(仅在使用 NHibernate ITransaction
API 时),使用解释的常规程序自动刷新,或仅在显式调用 Flush()
时才刷新。最后一种模式适用于长时间运行的工作单元,在其中保持打开和断开连接的 ISession
。
...
结束会话包括四个不同的阶段:
刷新会话
如果您正在使用 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()
将其返回到池中。