- 对象
- ISessionFactory (NHibernate.ISessionFactory)
-
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 它是生成ISession的工厂,本身要用到IConnectionProvider。 该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。
- ISession (NHibernate.ISession)
-
表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短。 其隐藏了ADO.NET连接,也是 ITransaction的工厂。 其会持有一个针对持久化对象的必选(第一级)缓存, 在遍历对象图或者根据持久化标识查找对象时会用到。
- 持久的对象及其集合(Persistent Objects and Collections)
-
带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。 这些对象可能是普通的POCOs, 唯一特殊的是他们正与(仅仅一个)ISession相关联。 一旦这个ISession被关闭, 这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。 (例如,用作跟表示层打交道的数据传输对象。)
- 瞬态(transient)和脱管(detached)的对象及其集合
-
那些目前没有与ISession关联的持久化类实例。 他们可能是在被应用程序实例化后, 尚未进行持久化的对象。 也可能是因为实例化他们的ISession已经被关闭而脱离持久化的对象。
- ITransaction (NHibernate.ITransaction)
-
(可选的)应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。 它通过抽象将应用从底层具体的ADO.NET事务隔离开。 某些情况下,一个ISession之内可能包含多个ITransaction对象。
- IConnectionProvider (NHibernate.Connection.IConnectionProvider)
-
(可选的)生成ADO.NET连接以及Command对象的工厂。 它通过抽象将应用从底层的IDbConnection或IDbCommand隔离开。 仅供开发者扩展/实现用,并不暴露给应用程序使用。
- IDriver (NHibernate.Driver.IDriver)
-
(可选的)一个封装了不同ADO.NET providers之间的差异(利用参数命名转换等ADO.NET支持的特性)的接口。
- ITransactionFactory (NHibernate.Transaction.ITransactionFactory)
-
(可选的)生成ITransaction对象实例的工厂。 仅供开发者扩展/实现用,并不暴露给应用程序使用。
在特定“轻型”的体系结构中,应用程序可能绕过 ITransaction/ITransactionFactory 以及 IConnectionProvider 等API直接跟ADO.NET打交道。
实例状态
一个持久化类的实例可能处于三种不同状态中的某一种。 这三种状态的定义则与所谓的持久化上下文(persistence context)有关。 NHibernate的ISession对象就是这个所谓的持久化上下文:
- 瞬态(transient)
-
该实例从未与任何持久化上下文关联过。它没有持久化标识(相当于主键值)。说白了就是还没跟NHibernate的一个普通C#对象。
- 持久化(persistent)
-
实例目前与某个持久化上下文有关联。 它拥有持久化标识(相当于主键值),并且可能在数据库中有一个对应的行。 对于某一个特定的持久化上下文,NHibernate保证持久化标识与CLR标识(其值代表对象在内存中的位置)等价。说白了就是对应一个ISession的一个C#对象,能够使用ISession持久化到数据库。
- 脱管(detached)
-
实例曾经与某个持久化上下文发生过关联,不过那个上下文被关闭了, 或者这个实例是被序列化(serialize)到另外的进程。 它拥有持久化标识,并且在数据库中可能存在一个对应的行。 对于脱管状态的实例,NHibernate不保证任何持久化标识和CLR标识的关系。 说白了就是ISession已经关闭了之后的持久化对象。
上下文相关的(Contextual)Session
使用NHibernate的大多数应用程序需要某种形式的“上下文相关的” session,特定的session在整个特定的上下文范围内始终有效。 然而,对不同类型的应用程序而言,要为什么是组成这种“上下文”下一个定义通常是困难的;不同的上下文对“当前”这个概念定义了不同的范围。
从1.2版本开始,NHibernate增加了ISessionFactory.GetCurrentSession()方法,ISessionFactory.GetCurrentSession()的后台实现是可拔插的。 因此,我们引入了新的扩展接口(NHibernate.Context.ICurrentSessionContext)和新的配置参数(hibernate.current_session_context_class), 以便对什么是“当前session”的范围和上下文(scope and context)的进行可拔插式定义。
请参阅NHibernate.Context.ICurrentSessionContext接口的API文档,那里有关于它的契约的详细讨论。 它定义了单一的方法,CurrentSession(),特定的实现用它来负责跟踪当前的上下文session。NHibernate 2.0.0内置了此接口的以下几种实现。
-
NHibernate.Context.ManagedWebSessionContext - 当前session保存在HttpContext之中。 但是,你必须自己通过CurrentSessionContext类中的静态方法手动的把ISession实例绑定或者取消绑定到当前上下文, ISession自己不会打开创建、清楚、或者关闭。
-
NHibernate.Context.CallSessionContext - 当前session保存在CallContext. 你必须自己通过CurrentSessionContext类中的静态方法手动的把ISession实例绑定或者取消绑定到当前上下文。
-
NHibernate.Context.ThreadStaticSessionContext - 当前session保存在Thread Static变量。这个上下文只支持一个ISessionFactory. 你必须自己通过CurrentSessionContext类中的静态方法手动的把ISession实例绑定或者取消绑定到当前上下文,
-
NHibernate.Context.WebSessionContext - 和上面的ManagedWebSessionContext类似, 当前session保存在HttpContext之中。 但是,你必须自己通过CurrentSessionContext类中的静态方法手动的把ISession实例绑定或者取消绑定到当前上下文,
hibernate.current_session_context_class配置参数定义了应该采用哪个NHibernate.Context.ICurrentSessionContext 实现。一般而言,此参数的值指明了要使用的实现类的全名,但那三种内置的实现可以使用简写,即"managed_web", "call","thread_static", and "web"。