NHibernate中文文档
- 格式:doc
- 大小:390.00 KB
- 文档页数:24
第一篇:官方文档的处理方法,摘自官方在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持。
1.使用SQLQueryhibernate对原生SQL查询执行的控制是通过SQLQuery接口进行的.1Session.createSQLQuery();1.1标量查询最基本的SQL查询就是获得一个标量(数值)的列表。
1sess.createSQLQuery("SELECT * FROM CATS").list();2sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();将返回一个Object数组(Object[])组成的List,数组每个元素都是CATS表的一个字段值。
Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型。
如果要避免过多的使用ResultSetMetadata,或者只是为了更加明确的指名返回值,可以使用addScalar()。
1sess.createSQLQuery("SELECT * FROM CATS")2 .addScalar("ID", Hibernate.LONG)3 .addScalar("NAME", Hibernate.STRING)4 .addScalar("BIRTHDATE", Hibernate.DATE)这个查询指定了:SQL查询字符串,要返回的字段和类型.它仍然会返回Object数组,但是此时不再使用ResultSetMetdata,而是明确的将ID,NAME和BIRTHDATE 按照Long, String和Short类型从resultset中取出。
同时,也指明了就算query 是使用*来查询的,可能获得超过列出的这三个字段,也仅仅会返回这三个字段。
NHibernate之旅一、开篇有益(一)NHibernate的架构图1.1-1 NHibernate体系结构抽象概览图图1.1-2 轻量级体系图,由应用程序提供连接,自行管理实务图1.1-3 重量级体系图,所有的底层 API都被抽象出来(二)NHibernate资源✓最新版本下载地址:/projects/nhibernate/✓扩展项目下载地址:/projects/nhcontrib/✓下载地址:/download.aspx✓NHibernate Profiler性能监视器下载地址:/Download✓NHibernate专题:/zt/NHibernate/ (中文)✓NHibernate官方主页:/(英文)✓NHibernate之夏系列录像教程:/(英文)✓NHibernate中文社区:/group/NHibernate二、第一个NHibernate程序(一)关于NHibernate2.1版本的一些说明NHibernate2.1版本改变了ByteCode延迟加载机制,有三种IoC框架动态代理方式,分别为:Castle框架、LinFu框架、框架。
我们只要选择一种,在配置文件中配置proxyfactory.factory_class节点。
如果使用Castle.DynamicProxy2动态代理,引用NHibernate.ByteCode.Castle.dll程序集并配置proxyfactory.factory_class节点为<propertyname=”proxyfactory.factory_class”>NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate .ByteCode.Castle</property>。
如果使用LinFu.DynamicProxy动态代理,引用NHibernate.ByteCode.LinFu.dll程序集并配置proxyfactory.factory_class节点为<propertyname=”proxyfactory.factory_class”>NHibernate.ByteCode.LinFu.ProxyFactoryFactory,NHibernate. ByteCode.LinFu</property>。
NHibernate官⽅⽂档中⽂版--基础ORM(BasicORMapping)映射声明对象/关系映射在XML⽂件中配置。
mapping⽂件这样设计是为了使它可读性强并且可修改。
mapping语⾔是以对象为中⼼,意味着mapping是围绕着持久化类声明来建⽴的,⽽不是围绕数据表。
要注意的是,尽管很多NHibernate使⽤者选择⼿动定义XML⽂件,但是仍然有很多⼯具可以⽤来⽣成mapping⽂件,包括NHibernate.Mapping.Attributes 库和各种各样基于模板的代码⽣成⼯具(CodeSmith, MyGeneration)。
让我们⽤⼀个mapping的例⼦作为开始:<?xml version="1.0"?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Eg"namespace="Eg"><class name="Cat" table="CATS" discriminator-value="C"><id name="Id" column="uid" type="Int64"><generator class="hilo"/></id><discriminator column="subclass" type="Char"/><property name="BirthDate" type="Date"/><property name="Color" not-null="true"/><property name="Sex" not-null="true" update="false"/><property name="Weight"/><many-to-one name="Mate" column="mate_id"/><set name="Kittens"><key column="mother_id"/><one-to-many class="Cat"/></set><subclass name="DomesticCat" discriminator-value="D"><property name="Name" type="String"/></subclass></class><class name="Dog"><!-- mapping for Dog could go here --></class></hibernate-mapping>我们现在讨论mapping⽂件中的内容。
1.Configuration2.SessionFactory3. Transaction4.保存学生记录的例子保存、更新一定要显式调用事务5.many—to one的级连更新例子6.hibernate查询复杂的查询需求–Restrictions,Projections的用法结果集排序投影Projections,提供聚合函数的类对多个字段进行投影7.分页查询8.根据模版例子查询9.离线查询10.HQL聚合函数11.HQL例子12.清除Session内部缓存的两个方法,Session.evict(Object o) ,Session.clear() 清空内部缓存13.inverse14.15.Hibernate设置二级缓存16.使用经验使用Hibernate 必须首先提供这些基础信息以完成初始化工作,为后继操作做好准备。
这些属性在hibernate 配置文件(hibernate.cfg.xml或hibernate.properties)中加以设定。
Hibernate会自动在当前的CLASSPATH 中搜寻hibernate.cfg.xml文件并将其读取到内存中作为后继操作的基础配置。
Configuration config= new Configuration().configure();会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。
它在多个应用线程间进行共享。
通常情况下,整个应用只有唯一的一个会话工厂。
如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。
SessionFactory负责创建Session 实例。
我们可以通过Configuation实例构建SessionFactory:Configuration config = new Configuration().configure();SessionFactory sessionFactory= config.buildSessionFactory();使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)。
HibernateValidation中文Hibernate Validation 中文Hibernate 验证器文档前言:Annotations 是为域对象指定一个不变约束的便利而优雅的途径.例如通过它,你可以表示一个属性不应该是Null值,账户余额绝对不能是负值,等等。
这些域模型的约束通过注释它的属性声明在bean自身。
验证器可以读取这些注释并检查约束违反性。
验证机制可以在没有重复这些规则的情况下在应用程序的不同层里执行(表示层,数据访问层).Hibernate验证器在遵循DRY规则的情况下设计.Hibernate 验证器工作在两个级别。
首先,它能检测位于内存的类实例的约束违反性.其次,它可以把约束应用在hibernate的元模型中并且把它们应用在生成的数据库中.每一个约束注释都与一个为检查实体实例而实现的验证器对应关联。
一个验证器也可以可选的应用约束到hibernate元模型,允许hibernate生成DDL来表达这些约束。
利用合适的事件监听器,你可以通过hibernate在插入或更新的时候检查约束性。
Hibernate验证器没有限定在必须配合hibernate执行验证。
你也可以容易的把它用在其他java的持久化提供者上面(实现了实体监听器).在运行期检查实例时,hibernate验证器把有关违反验证的信息放在一个InvalidValue类型的数组里返回.在其他信息中,InvalidValue所包含的错误描述消息可以嵌入参数值和注释绑定,并且消息字符串可以以资源文件的形式提供.第一章定义约束1.1 什么是约束约束是一个给定的元素(可以使field,property,或bean)所必须遵循的规则.规则的语义可以由注释表达。
约束通常有一些属性用来参数化约束限制。
这些约束应用到被注释的元素。
1.2 内建约束与Hibernate 验证器一起内建了一些约束,他们已经覆盖了大多数基本的数据检查,当然我们后来会看到,你不一定使用它们,你可以在一分钟内写出你自己的约束。
Hibernate5用户手册中文版Hibernate用户手册Hibernate-纯java的关系型持久层框Hibernate团队JBoss可视化设计团队5.0.0.FinalCopyright?2011Red Hat,Inc.2015-08-20目录Hibernate用户手册 (1)Hibernate-纯java的关系型持久层框 (1) Hibernate团队 (1)JBoss可视化设计团队 (1)序言 (8)第1章.Architecture(体系架构) (9)1.1.概述 (10)1.2.Contextual sessions(session上下文) (11) 第2章.Domain Model(域模型) (12)2.1.POJO模型 (13)2.1.1.实现无参构造函数 (13)2.1.2.提供identifier(标识)属性 (13)2.1.3.使用非final类 (14)2.1.4.为持久化属性声明get,set方法 (14)2.1.5.实现equals()与hashCode()方法 (14)2.2.Dynamic(动态)模型 (21)第3章Bootstrap(引导、启动 (22)3.1.Native(原生、本地)引导 (22)3.1.1.构建ServiceRegistry (23)3.1.2.构建Metadata (25)3.1.3.构建SessionFactory (27)3.2.JPA引导JPA Bootstrapping (29)3.2.1.JPA兼容模式的引导 (29)3.2.2.Proprietary2-phase引导 (30)第4章持久化Context(上下文) (30)4.1.实体持久化 (31)4.2.删除实体 (32)4.3.获取没有初始化数据的实体 (32)4.4.获取已经初始化数据的实体 (33)4.5.通过natural-id(自然ID)获得实体 (33)4.6.刷新实体状态 (35)4.7.更改托管态或者持久态 (36)4.8.使用游离态数据 (36)4.8.1.复位游离态数据(游离态变成托管态) (37) 4.8.2.合并游离态数据4.9.验证对象的状态 (38)4.10.从JPA访问Hibernate (39)第5章访问数据库 (40)5.1.ConnectionProvider(连接提供器) (40)5.1.1.使用DataSources (41)5.1.2.使用c3p0 (41)5.1.3.使用proxool连接池 (43)5.1.4.使用Hikari (44)5.1.5.使用Hibernate内置的(不支持)的连接池 (45) 5.1.6.用户自定义的连接 (45)5.1.7.ConnectionProvider事务设置 (45)5.2.数据库Dialect(方言) (45)第6章事务与并发控制 (48)6.1.物理事务 (49)6.1.1.JTA配置 (50)6.2.Hibernate事务API (51)6.3.事务模式(与反模式) (55)6.3.1.Session-per-operation(每操作一个会话)反模式 (55) 6.3.2.Session-per-request(每请求一个会话)模式 (56) 6.3.3.Conversations(对话) (57)6.3.4.Session-per-application(每应用一个会话) (58)6.4.常见问题 (58)第7章JNDI (59)第8章锁 (59)8.1.乐观锁 (60)8.1.1.指定版本号 (61)8.1.2.Timestamp(时间戳) (63)8.2.悲观锁 (64)8.2.1.LockMode类 (65)第9章Fetching(抓取) (66)9.1.基础 (66)9.2.应用抓取策略 (68)9.2.1.不抓取 (69)9.2.2.通过查询动态抓取 (70)9.2.3.通过配置文件动态抓取 (71)第10章批处理 (72)10.1.JDBC批处理 (72)第11章缓冲 (73)11.1.配置二级缓存 (73)11.1.1.RegionFactory(注册工厂) (73)11.1.2.缓冲行为 (74)11.2.管理缓冲数据 (75)第十二章12.拦截器和事件 (76)12.1.拦截器(Interceptors) (76)12.2.Native(原生、本地)事件系统 (77)12.2.1.Hibernate声明式安全 (78)12.3.JPA回调 (80)第13章HQL与JPQL (83)13.1.大小写敏感性 (85)13.2.语句(Stataement)类型 (85)13.2.1.Select语句 (86)13.2.2.Update语句 (86)13.2.3.Delete语句 (88)13.2.4.Insert语句 (88)13.3.FROM子句 (89)13.3.1.标识变量 (89)13.3.2.Root(根)实体引用 (90)13.3.3.显式join (91)13.3.4.隐式join(path表达式) (93)13.3.5.集合成员引用 (95)13.3.6.Polymorphism(多态) (97)13.4.表达式 (98)13.4.1.标识变量 (98)13.4.2.路径表达式 (98)13.4.3.文本说明 (98)13.4.4.参数 (100)13.4.5.算术运算 (101)13.4.6.Concatenation(串联)(运算) (102) 13.4.7.聚合函数 (103)13.4.8.Scalar(标量)函数 (103)13.4.9.集合相关的表达式 (106)13.4.10.实体类型 (108)13.4.11.CASE表达式 (109)13.5.SELECT子句 (111)13.6.Predicates(谓词) (112)13.6.1.关系比较 (112)13.6.2.空值谓词 (114)13.6.3.Like谓词 (114)13.6.4.Between谓词 (115) 13.6.5.In谓词 (116)13.6.6.Exists谓词 (118)13.6.7.空集合谓词 (118)13.6.8.集合成员谓词 (118)13.6.9.NOT谓词 (119)13.6.10.AND谓词 (119)13.6.11.OR谓词 (119)13.7.WHERE子句 (119)13.8.分组 (119)13.9.排序 (120)13.10.查询API (121)13.10.1.Hibernate查询API (121) 13.10.2.JPA查询API (125)第14章Criteria (128)14.1.类型化criteria查询 (130) 14.1.1.选择一个实体 (130)14.1.2.选择一个表达式 (131) 14.1.3.选择多个值 (131)14.1.4.选择wrapper(封装) (133) 14.2.Tuple criteria查询 (134) 14.3.FROM子句 (135)14.3.1.Roots(根) (136)14.3.2.Joins (137)14.3.3.抓取 (138)14.4.路径表达式 (139)14.5.使用参数 (139)第15章Native SQL查询(原生SQL查询,本地SQL查询)(139)15.1.使用SQLQuery (140)15.1.1.Scalar(标量)查询 (140)15.1.2.实体查询 (141)15.1.3.处理association(关联)与集合 (142)15.1.4.返回多个实体 (143)15.1.5.返回非托管实体 (146)15.1.6.处理继承 (147)15.1.7.参数 (147)15.2.命名SQL查询 (147)15.2.1.使用return-property显式指定列与别名 (155)15.2.2.使用存储过程查询 (157)15.3.自定义新建、更新、删除的SQL语句 (158)15.4.自定义SQL加载 (162)Chapter16.Multi-tenancy(多租户) (163)16.1.什么是Multi-tenancy(多租户) (163)16.2.多租户数据处理方法 (164)16.2.1.Separate databa(独立数据库) (164)16.2.2.独立的schema (165)16.2.3.数据分区(鉴别器) (166)16.3.Hibernate中的Multi-tenancy(多租户) (167)16.3.1.MultiTenantConnectionProvider (168)16.3.2.CurrentTenantIdentifierResolver (169)16.3.3.缓冲 (169)16.3.4.杂项 (170)16.4.MultiTenantConnectionProvider实现策略 (170)第17章OSGi (173)17.1.OSGi规范与环境 (174)17.2.hibernate-osgi (174)17.3.features.xml (174)17.4.快速入门与演示 (175)17.5.容器管理的JPA (175)17.5.1.企业级OSGi的JPA容器 (175)17.5.2.persistence.xml (176)17.5.3.DataSource(数据源) (176)17.5.4.Bundle包的导入 (177)17.5.5.获取EntityManger(实体管理器) (177) 17.6.非托管JPA (178)17.6.1.persistence.xml (178)17.6.2.Bundle包的导入 (178)17.6.3.获取EntityMangerFactory (179)17.7.非托管Native (180)17.7.1.Bundle包的导入 (180)17.7.2.获取SessionFactory (180)17.8.可选模块 (181)17.9.扩展点 (181)17.10.附加说明 (183)第18章Envers (184)18.1.基础知识 (185)18.2.配置 (186)18.3.额外的映射注释 (189)18.4.选择audit策略 (190)18.5.版本日志 (190)版本日志的数据 (190)18.5.1.在版本控制中跟踪修改的实体名 (193) 18.6.在属性级别上跟踪实体变化 (196)18.7.查询 (197)18.7.1.指定一个版本查询类的实体 (197)18.7.2.按实体类的变化,查询版本 (198)18.7.3.通过指定属性的变化查询实体的版本 (199)18.7.4.按版本查询实体的修改 (200)18.8.条件audit (201)18.9.理解Envers Schema (202)18.10.使用Ant生成schema (203)18.11.映射异常 (205)18.11.1.现在不会将来也不会支持的 (205)18.11.2.现在不会将来会支持的 (205)18.11.3.@OneToMany+@JoinColumn (205)18.12.高级:Audit表分区 (206)18.12.1.audit表分区的好处 (206)18.12.2.选择合适的列为audit表分区 (206)18.12.3.Audit表分区示例 (207)18.13.Envers有关的链接 (209)第19章.数据库可移植性思考 (210)19.1.可移植性基础 (210)19.2.Dialect(方言) (210)19.3.Dialect(方言)解析 (210)19.4.标识符生成 (211)19.5.数据库函数 (212)19.6.类型映射 (213)附录A Legacy Bootstrapping(过时的引导方式) (213) A.1.迁移 (214)附录B Legacy(过时的)Hibernate Criteria查询 (216) B.1.建立Criteria实例 (217)B.2.减小结果集 (217)B.3.排序结果集 (218)B.4.关联 (219)B.5.动态关联抓取 (220)ponents(组件) (220)B.7.集合 (221)B.8.Example查询 (221)B.9.Projections(投影),聚合与分组 (222)B.10.Detached queries(分离式查询)与子查询 (224)B.11.通过natural(自然)ID查询 (226)参考 (227)序言面向对象的开发在处理关系型数据库中的数据时是非常麻烦与消耗资源的。
NHibernate基础教程NHibernate之旅系列⽂章导航宣传语NHibernate、NHibernate教程、NHibernate⼊门、NHibernate下载、NHibernate教程中⽂版、NHibernate实例、NHibernate2.0、NHibernate2.0教程、NHibernate之旅、NHibernate⼯具我的NHibernate全部⽂章在导游NHibernate是把Java的Hibernate核⼼部分移植到Microsoft .NET Framework上。
它是⼀个对象关系映射⼯具,其⽬标是把.NET对象持久化到关系数据库。
NHibernate在2008年8⽉31⽇发布了NHibernate2.0版本,代表NHibernate⼜向前⾛了⼀步,我相信NHibernate将会越来越强⼤。
NHibernate在2009年10⽉31⽇发布了.Net2.0最后⼀个版本NHibernate2.1.1.GA,这也代表着下⼀步的新版本。
这个NHibernate之旅系列带你来到NHibernate的世界。
⼀步⼀步看清NHibernate中的种种细节。
环境优先这次NHibernate2.0系列之旅使⽤Microsoft Visual Studio 2008 SP1、SQL Server 2008 Express、NHibernate2.1.1.GA最新版本。
如果你第⼀次使⽤NHibernate,先到这⾥NHibernate最新版本(包括源码、发布版本、参考⽂档、API⽂档,可选择下载)。
如果⽤到NHibernate的扩展项⽬到这⾥获得NHibernate Contrib最新版本。
NHibernate-2.1.1.GA是.NET2.0平台的最后⼀个版本,关于NHibernate-2.1.1.GA的更多信息请点击。
休息接待区欢迎加⼊!在讨论中寻找乐趣!在问题中寻找答案!旅途站点路线第⼀站:熟悉NHibernate第⼆站:接触NHibernate第三站:数据在我⼿中第四站:控制你的全部观光站:实⽤技巧补偿第五站:关系如此复杂第六站:我来加载你第七站:数据的镜⼦第⼋站:转载请注明第九站:对象的始末更多NHibernate资料请点击。
第1章NHibernate体系结构总览对NHibernate体系结构的非常高层的概览:这幅图展示了NHibernate使用数据库和配置文件数据来为应用程序提供持久化服务(和持久化的对象)。
我们试图显示更多NHibernate运行时体系结构的细节。
但挺不幸的,NHibernate是比较灵活的并且提供了好几种不同的运行方式。
我们展示一下两种极端情况。
轻型体系中,应用程序自己提供连接,并且自行管理事务。
这种方式使用了NHibernate API的一个最小子集。
全面解决体系中,对于应用程序来说,所有的底层 API都被抽象了,NHibernate会替你照管所有的细节。
下面是图中一些对象的定义:SessionFactory (NHibernate.ISessionFactory) 对属于单一数据库的编译过的映射文件的一个线程安全的,不可变的缓存快照。
它是Session的工厂,是ConnectionProvider的客户。
可以持有一个可选的(第二级)数据缓存,可以在进程级别或集群级别保存可以在事物中重用的数据。
会话Session (NHibernate.ISession) 单线程,生命期短促的对象,代表应用程序和持久化层之间的一次对话。
封装了一个连接。
也是Transaction的工厂。
保存有必需的(第一级)持久化对象的缓存,用于遍历对象图,或者通过标识符查找对象。
持久化对象(Persistent)及其集合(Collections) 生命期短促的单线程的对象,包含了持久化状态和商业功能。
它们可能是普通的对象,唯一特别的是他们现在从属于且仅从属于一个Session。
一旦Session被关闭,他们都将从Session中取消联系,可以在任何程序层自由使用(比如,直接作为传送到表现层的DTO,数据传输对象)。
临时对象(Transient Object)及其集合(Collection)目前没有从属于一个Session的持久化类的实例。
他们可能是刚刚被程序实例化,还没有来得及被持久化,或者是被一个已经关闭的Session所实例化的。
事务Transaction (NHibernate.ITransaction) (可选)单线程,生命期短促的对象,应用程序用它来表示一批工作的原子操作。
是底层的事务的抽象。
一个Session某些情况下可能跨越多个Transaction 事务。
ConnectionProvider(NHibernate.Connection.ConnectionPro vider) (可选)连接的工厂。
从底层的IDbConnection抽象而来。
对应用程序不可见,但可以被开发者扩展/实现。
TransactionFactory(net.sf.hibernate.TransactionFactory)(可选)事务实例的工厂。
对应用程序不可见,但可以被开发者扩展/实现。
在上面的轻型结构中,程序没有使用Transaction / TransactionFactory 或ConnectionProvider API,直接和对话了。
第2章ISessionFactory配置目录可编程配置方式获取ISessionFactory用户自行提供连接NHibernate提供连接可选配置属性SQL 方言(SQL Dialects)外连接抓取(Outer Join Fetching )自定义CacheProvider查询语言替换Logging因为NHibernate被设计为可以在许多不同环境下工作,所以它有很多配置参数。
幸运的是,大部分都已经有默认值了。
NHibernate.Test.dll包含了一个示例的配置文件app.config,它演示了一些可变的参数。
可编程配置方式NHibernate.Cfg.Configuration的一个实例代表了应用程序中所有的.NET类到SQL数据库的映射的集合。
Configuration用于构造一个(不可变的)ISessionFactory。
这些映射是从一些XML映射文件中编译得来的。
你可以得到一个Configuration的实例,直接实例化它即可。
下面有一个例子,用来从两个XML配置文件(和exe文件在同一个目录下)中的映射中初始化:Configuration cfg = new Configuration().AddXmlFile("Item.hbm.xml").AddXmlFile("Bid.hbm.xml");另外一个(某些时候更好的)方法是让NHibernate自行用GetManifestResourceStream()来装载映射文件Configuration cfg = new Configuration().AddClass( typeof(NHibernate.Auction.Item) ).AddClass( typeof(NHibernate.Auction.Bid) );NHibernate 就会在这些类型的程序集的嵌入的资源中寻找叫做NHibernate.Auction.Item.hbm.xml 和NHibernate.Auction.Bid.hbm.xml 的映射文件。
这种方法取消了所有对文件名的硬编码。
另外一个(可能是最好的)方法是让NHibernate读取一个程序集中所有的配置文件:Configuration cfg = new Configuration().AddAssembly( "NHibernate.Auction" );NHibernate将会遍历程序集查找任何以hbm.xml结尾的文件。
这种方法取消了所有对文件名的硬编码并且确保程序集中的配置文件文件都会被加载。
在使用或者NAnt生成程序集时请确保hbm.xml文件是作为嵌入资源(Embedded Resources)添加的。
Configuration也可以指定一些可选的配置项Hashtable props = new Hashtable();...Configuration cfg = new Configuration().AddClass( typeof(NHibernate.Auction.Item) ).AddClass( typeof(NHibernate.Auction.Bid) );cfg.Properties = props;Configuration是仅在配置期使用的对象,从第一个SessionFactory开始建立的时候,它就失效了。
获取ISessionFactory当所有的映射都被Configuration解析之后,应用程序为了得到ISession实例,必须先得到它的工厂。
这个工厂应该是被应用程序的所有线程共享的:ISessionFactory sessions = cfg.BuildSessionFactory();当然,NHibernate并不禁止你的程序实例化多个ISessionFactory。
在你使用不止一个数据库的时候,这就有用了。
用户自行提供连接ISessionFactory可以使用一个用户自行提供的连接来打开一个ISession。
这种设计可以让应用程序来自己管理连接:IDbConnection conn = myapp.GetOpenConnection();ISession session = sessions.OpenSession(conn);// do some data access work应用程序必须小心,不能在同一个连接上打开两个并行的ISession!NHibernate提供连接另一种方法就是,你可以让ISessionFactory替你打开连接。
SessionFactory必须事先知道连接的参数,有几种不同的方法设置参数:1. 通过提供一个IDictionary实例给Configuration.Properties。
2. 在名为nhibernate的ValueSectionHandler类型的配置节点添加属性。
3. 在hibernate.cfg.xml 中包含<property>元素。
如果你使用这种方法,打开一个ISession是非常简单的:可选配置属性下面是一些在运行时可以改变NHibernate行为的其他配置。
所有这些都是可选的,也有合理的默认值。
表 2.2. NHibernate 配置属性Logging通过Apache log4net,NHibernate记录很多事件。
你可以从/log4net/下载log4net. 要使用log4net,你要在app.config或者web.config中配置log4net 节点.在src/NHibernate.Test工程中有一个配置的例子.我们强烈建议你熟悉NHibernate's的log信息。
NHibernate's的很多工作都会尽量详细的留下log,也没有让它变的难以阅读。
这是用来解决问题的最基本的设施。
第3章持久化类(Persistent Classes)目录POCO 简单示例为持久化字段声明访问器(getters 和setters)实现一个默认的构造方法(constructor)提供一个标识属性(identifier property)(可选)建议使用不是sealed的类(可选)实现继承(Inheritance)实现Equals()和GetHashCode()持久化生命周期(Lifecycle)中的回调(Callbacks)合法性检查(Validatable)回调用属性替代XML持久化类是应用程序用来解决商业问题的类(比如,在电子交易程序中的Customer和Order)。
持久化类,就如同它的名字暗示的,是短暂存在的,它的实例会被持久性保存于数据库中。
如果这些类符合简单的规则,NHibernate能够工作得最好,这些规则就是Plain Old CLR Object (POJO,简单传统CLR对象)编程模型。
POCO 简单示例用一个类描述一只猫。
public class Cat{private long _id; // identifierprivate string _name;private DateTime _birthdate;private Cat _mate;private Set _kittens;private Color _color;private char _sex;private float _weight;public long Id{get { return _id; }set { _id = value; }}public string Name{get { return _name; }set { _name = value; }}public DateTime Birthdate{get { return _birthdate; }set { _birthdate = value; }}public Cat Mate{get { return _mate; }set { _mate = value; }}public Set Kittens{get { return _kittens; }set { _kittens = value; }}public Color Color{get { return _color; }set { _color = value; }}public char Sex{get { return _sex; }set { _sex = value; }}public float Weight{get { return _weight; }set { _weight = value; }}}有四条主要的规则:为持久化字段声明访问器(getters 和setters)Cat为它的所有可持久化字段声明了getters 和setters访问器。