【转】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 ...
随机推荐
- [整理]Error: [ngRepeat:dupes]的解决方法
sdfsadf <div class="pageNum middle PT10"> <a href="javascript:void(0);" ...
- Internet Explorer 6 的15个讨厌的bug和简单的解决方法
关于bug更全的,我推荐去这个网站hasLayout,整理的非常全!三年前就看了,最近手生,又翻出来看看~~虽然上面有很多bug讲解,但是我觉得目前用的比较多或者说是常见的应该属下面这篇文章,15 a ...
- 【LibreOJ】#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop 线段树+完全背包
[题目]#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop [题意]给定一个长度为n的物品序列,每个物品有价值.不超过m的重量.要求支持以下三种操作:1.物品价值区间加减,2.物 ...
- JavaScript 计时
http://www.w3school.com.cn/js/js_timing.asp JavaScript 计时事件 通过使用 JavaScript,我们有能力作到在一个设定的时间间隔之后来执行代码 ...
- HDU 1867 A + B for you again 字符匹配
解题报告:给你两个字符串,让你连接起来,没有前后顺序,要求是长度最短优先,其次是字典序最小.这题我用的是KMP,做两次匹配,分别把第一次跟第二次输入的字符串放前面,然后比较两次得到的字符窜的长度和字典 ...
- Django安装配置
django2.0基础 一.安装与项目的创建 1.安装 pip install django 2.查看版本 python -m django --version 3.创建项目 django-admin ...
- 主流服务器apache,iis,tomcat,jboss,resion,weblogic,websphere的区别
在互联网高速发展的今天,不同种类的网站大量涌现,每个人都在享受着网络服务带来的便利.而创建自己的个性化网站的门槛不断降低.从事网站架构,这种当年的绝对“”高科技“”绝活.也从it人员的专利“”沦落“” ...
- 批量增加Linux系统账号、重置账号密码、FTP账号批量测试
批量增加Linux系统账号.重置账号密码是用Linux Shell脚本来做的:批量FTP账号测试是用Python脚本来做的.这些脚本都是读取一个用户名和密码文件,然后基于该用户名密码文件进行自动批量测 ...
- docker之容器访问和网络连接(三)
前言 当一台服务器上部署了多个应用容器,它们直接可能需要相互通信,比如web应用容器需要访问mysql数据库容器. 主机访问容器 通过映射端口的形式我们可以在外部访问容器内的服务 # 将主机的127. ...
- Windows入侵问题排查
1.深入分析,查找入侵原因 1.1 检查帐户和弱口令 1.查看服务器已有系统或应用帐户是否存在弱口令 检查说明:主要检查系统管理员帐户.网站后台帐户.数据库帐户以及其他应用程序(FTP.Tomcao. ...