【转】NHibernate对象以及状态说明
- 对象
- 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"。
【转】NHibernate对象以及状态说明的更多相关文章
- [Nhibernate]对象状态
目录 写在前面 文档与系列文章 对象状态 瞬时态(Transient) 持久态(Persistent) 托管态(Detached) 对象状态转换 总结 写在前面 前面两篇文章介绍了SchemaExpo ...
- NHibernate系列文章七:NHibernate对象状态
摘要 NHibernate对象持久化 NHibernate对象的三个状态:临时态.持久态.游离态(托管态) NHibernate三状态的相互转化 1. NHibernate对象持久化 NHiberna ...
- NHibernate使用无状态Sessions
NHibernate 3.0 Cookbook第三章,Using stateless sessions的翻译. 当要处理大量的数据,你通常可能会使用更"底层"的API来改善性能,在 ...
- 深入Java虚拟机--判断对象存活状态
程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...
- Hibernate(3)——实例总结Hibernate对象的状态和ThreadLoacl封闭的session
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: Hibernate的内部执行过程(CRUD) 对象的状态及其转换图和例子 使用JUnit测试 使用getCur ...
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Python脚本控制的WebDriver 常用操作 <十九> 获取测试对象的状态
下面将使用webdriver来模拟测试中观察测试对象的状态的操作 测试用例场景 在web自动化测试中,我们需要获取测试对象的四种状态 是否显示.使用element.is_displayed()方法: ...
- Hibernate之Session对象的相关方法以及持久化对象的状态
一.持久化对象的状态 站在持久化的角度, Hibernate 把对象分为 4种状态: 持久化状态,临时状态,游离状态,删除状态.Session 的特定方法能使对象从一个状态转换到另一个状 ...
- Hibernate对象的状态和映射
一. Hibernate对象的状态 实体对象的三种状态: 1) 暂态(瞬时态)(Transient)---实体在内存中的自由存在,它与数据库的记录无关. po在DB中无记录(无副本),po和sessi ...
随机推荐
- 官方资料&一些好的博客与技术点
https://technet.microsoft.com/zh-cn/library/hh848794.aspxzh https://msdn.microsoft.com/en-us/power ...
- Gnucash数据库结构
- [转载]10款流行的Markdown编辑器
10款流行的Markdown编辑器 http://www.csdn.net/article/2014-05-05/2819623 作为一个开源人,如果你不会使用Markdown语法,那你就OUT了!M ...
- 关于aspx.designer.cs
.aspx文件..aspx.cs文件和.aspx.designer.cs的一些说明 .aspx文件:(页面)书写页面代码.存储的是页面design代码.只是放各个控件的代码,处理代码一般放在.cs文件 ...
- mysql双主+keepalived【转】
简单原理 1.在两台服务器上分别部署双主keepalived,主keepalived会在当前服务器配置虚拟IP用于mysql对外提供服务 2.在两台服务器上分别部署主主mysql,用于故障切换 3.当 ...
- python多个分割符split字符串
python中string自带的split不支持多个分隔符同时切分,用正则 import re line='hello,world' lineLists = re.split('[,,..??]',l ...
- Selector 实现原理
概述 Selector是NIO中实现I/O多路复用的关键类.Selector实现了通过一个线程管理多个Channel,从而管理多个网络连接的目的. Channel代表这一个网络连接通道,我们可以将Ch ...
- Web前端开发规范文档你需要知道的事
Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...
- javaScript对金额处理的方式
例如 var price = $("#price").val(); 此时price 为字符串格式 假使我们想将其乘以100 可以选择 price*100将其转换为数值格式 但是有些 ...
- java Stack(栈)
"Stack" 通常时指"后进后出"(LIFO)的容器,有时栈也被称为叠加栈,因为最后"压入"栈的元素,第一个"弹出"栈 ...