SlideShare a Scribd company logo
【.NET技术培训】


数据访问框架NHibernate(一)


     2011-3 侯昆(@wskyhx)
Nhibernate Architecture
http://nhforge.org/wikis/reference2-0en/architecture.aspx
从简单使用例子开始
http://nhforge.org/wikis/howtonh/your-first-nhibernate-based-application.aspx




                                      1.   编写实体
                                      2.   编写映射文件*.hbm.xml
                                      3.   编写hibernate.cfg.xml
                                      4.   初始化Nhibernate
                                      5.   自动搜索cfg配置文件
                                      6.   自动搜索映射文件
                                      7.   生成数据库schema
                                      8.   插入数据
                                      9.   查询
从简单使用例子开始
                            插入第一条记录
                            FirstEntity




    NHibernate.Criterion是Nhibernate提供的
    面向实体的标准查询支持

    NHibernate.Criterion.Expression下提供了
    常用的查询条件表达式,可以支持各种复杂的条
    件
NHibernate.Criterion提供的丰富查询支持
NHibernate.Criterion.Expression下提供了常用的查询条件表达式,可以支持各
种复杂的条件,支持hql和sql




NHibernate.Criterion.Order提供排序支持
NHibernate.Criterion提供的丰富查询支持
NHibernate.Criterion.Subqueries提供子查询支持

NHibernate.Criterion.Projections提供投影(Projection)支持,并支持hql和sql




【注意】
使用SQL会绕过Nhibernate的Session管理,会造成潜在问题,如:二级缓存stale
在有性能问题的少量场景可以使用SQL进行select查询
丌使用SQL进行update delete
   除非上下文没有其他逻辑
   或没有二级缓存,
   或你主动维护二级缓存
   或二级缓存失效时间很短
NHibernate.Criterion提供的丰富查询支持

NHibernate.Criterion.DetachedCriteria提供游离查询对象的支持




无需再构造各种各样的查询对象
直接在UI层构造DetachedCriteria,Service层用object传递
关系映射
one-to-many




many-to-one
关系映射
one-to-one(不建议使用)
many-to-many 需要中间表
关系映射
component




Component的属性也可以是其他Entity,如:FirstId映射为FirstEntity
SessionFactory和Session
SessionFactory
根据nhibernate配置构造并实例化,用于提供Session实例,以及二级缓存的
提供等。

Session
提供对数据库的访问, 实现了Unit of Work(工作单元)模式,对与其关联
的所有对象进行管理,记录并向数据库提交变更,内置缓存(一级缓存)




一级缓存的隐患:
没有大小限制,批量操作会带来内存开销问题,可使用bathsize来避免
Flush的问题
从我们的测试用例说起……




何时需要flush?
http://stackoverflow.com/questions/780755/nhibernate-flush-how-it-works
http://stackoverflow.com/questions/43320/nhibernate-isession-flush-where-and-
when-to-use-it-and-why
用事务则不用考虑,如果不,则在代码的最后flush

由此引出的问题:
Identity主键类型对模式的破坏:
http://nhforge.org/blogs/nhibernate/archive/2008/12/21/identity-the-never-
ending-story.aspx
Identity和guid之争?索引的生成问题?主键的大小?使用newsequentialid解决?
Flush引出的问题
使用 newid 产生的新的值是丌固定的,所以新的值导致索引B+树的变化是随机的。
而 newsequentialid 产生的新的值是有规律的,则索引B+树的变化是有规律的。
有规律和无规律就会带来性能的改进。
Flush引出的问题
using identity you are “disabling” the ADO-batcher NH’s feature for inserts

在Nhibernate中使用guid.comb解决索引顺序问题:
Lazyload和对象代理
Lazyload和对象代理
Property非引用类型无法进行lazyload,以下声明无效:


Lazyload的Null陷阱:动态代理对象




如何判断?




我们通过约定来避免该问题,数据库使用约定:
1. 数据(至少是业务数据)不做物理删除
2. 程序产生的delete代码将会被监控
二级缓存
http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html




                                       只能按主键缓存,条件查询可使用查询缓存
                                       什么样的数据适合存放到第二级缓存中?
                                       1.   很少被修改的数据
                                       2.   丌会被并发访问的数据
                                       3.   参考数据,指的是供应用参考的常量数据,它的实例
                                            数目有限,它的实例会被许多其他类的实例引用,
                                            实例极少或者从来丌会被修改。
对象状态
  http://www.cnblogs.com/RicCC/archive/2007/04/17/NHibernate-Entity-
  LifeCycle-Secondary-Cache-Interceptor.html


                                      Seesion


                                      关联(被管理,可以保存变更,可以lazyload)


New()               Session.save()
                                                                      没有关联session
                                                  session.Evict()

        Transient                    Persistent                     Detached
          瞬态                          持久态                           游离态
                                                                         不可以lazyload
                                                存在数据库记录

                                                        DB
我们对Nhibernate使用方式
 使用castle的nhibernate facilities初始化nhibernate
 使用castle的ISessionManager进行Isession自动管理,不需要session.close()
 使用castle的ATM进行自动事务控制,不需要session.beginTransaction()/flush()
 少量使用二级缓存,只对基本不变更但频繁访问的数据使用,如:User
 数据库连接加密:encrypt=“true”
其他
使用DetachedCriteria游离查询对象取代各种各样的Query对象

另外一种复用查询对象的方法:clone()

Projections缺陷:不能生成Entity,可考虑自行实现投影获取Entity(Castle ActiveRecord中有实现)

使用FluentNHibernate进行Mapping具备很好的描述能力: http://wiki.fluentnhibernate.org/Fluent_mapping

EntityName的使用

http://nhforge.org/wikis/howtonh/mapping-the-same-class-to-a-view-and-a-table-using-entity-name.aspx

http://www.cnblogs.com/lyj/archive/2009/12/08/nhibernate-new-features-entity-name.html

理解Nhibernate类型系统:http://dotnet.dzone.com/articles/understanding-nhibernate-type

Nhibernate调优:HQL和Criteria的调优要在理解mapping的基础上,在确实存在问题的地方直接使用SQL

NHibernate3.0 新特性

参考资料:

http://nhforge.org/Default.aspx

http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html
ORM技术选型
   POCO支持
   对象状态管理
   关系映射
   设计侵入性
   自动事务控制,管理
   SQL支持
   文档,源码质量
   数据库无关性支持
   存储过程支持
   SQL跟踪,调优
   批处理
   多级缓存
   开源
   contrib丰富
   lazyload
   api粒度,设计优雅
Nhibernate作为一个成熟的ORM框架,它的层次、扩展、开放性设计以及源码具
有很高的学习价值,可以看到众多经典的企业应用架构模式的身影




           Tank You

More Related Content

What's hot

IoTDB Ops
IoTDB OpsIoTDB Ops
IoTDB Ops
JialinQiao
 
组合、备忘录、建造者模式、原型
组合、备忘录、建造者模式、原型组合、备忘录、建造者模式、原型
组合、备忘录、建造者模式、原型
诸葛修车网-诸葛商城
 
Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享Wade Huang
 
CH04:認識物件
CH04:認識物件CH04:認識物件
CH04:認識物件
Justin Lin
 
4, OCP - oracle networking
4, OCP - oracle networking4, OCP - oracle networking
4, OCP - oracle networking
ted-xu
 
整合資料庫
整合資料庫整合資料庫
整合資料庫
Justin Lin
 
Enqueue Lock介绍.ppt
Enqueue Lock介绍.pptEnqueue Lock介绍.ppt
Enqueue Lock介绍.pptjames tong
 
Java并发编程培训
Java并发编程培训Java并发编程培训
Java并发编程培训dcshi
 
JavaScript 技術手冊第 5 章
JavaScript 技術手冊第 5 章JavaScript 技術手冊第 5 章
JavaScript 技術手冊第 5 章
Justin Lin
 
CH09:Collection與Map
CH09:Collection與MapCH09:Collection與Map
CH09:Collection與Map
Justin Lin
 
由一个简单的程序谈起――之五(精华)
由一个简单的程序谈起――之五(精华)由一个简单的程序谈起――之五(精华)
由一个简单的程序谈起――之五(精华)yiditushe
 
第06章 树和二叉树(java版)
第06章  树和二叉树(java版)第06章  树和二叉树(java版)
第06章 树和二叉树(java版)Yan Li
 
JAVA内存泄漏及诊断
JAVA内存泄漏及诊断JAVA内存泄漏及诊断
JAVA内存泄漏及诊断
ivannotes
 
安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb
Albert Hong
 
Hibernate的高级操作
Hibernate的高级操作Hibernate的高级操作
Hibernate的高级操作yiditushe
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
Justin Lin
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典yiditushe
 
Struts学习笔记
Struts学习笔记Struts学习笔记
Struts学习笔记yiditushe
 
MySQL和IO(上)
MySQL和IO(上)MySQL和IO(上)
MySQL和IO(上)Feng Yu
 

What's hot (20)

IoTDB Ops
IoTDB OpsIoTDB Ops
IoTDB Ops
 
组合、备忘录、建造者模式、原型
组合、备忘录、建造者模式、原型组合、备忘录、建造者模式、原型
组合、备忘录、建造者模式、原型
 
Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享
 
CH04:認識物件
CH04:認識物件CH04:認識物件
CH04:認識物件
 
4, OCP - oracle networking
4, OCP - oracle networking4, OCP - oracle networking
4, OCP - oracle networking
 
整合資料庫
整合資料庫整合資料庫
整合資料庫
 
Enqueue Lock介绍.ppt
Enqueue Lock介绍.pptEnqueue Lock介绍.ppt
Enqueue Lock介绍.ppt
 
Java并发编程培训
Java并发编程培训Java并发编程培训
Java并发编程培训
 
JavaScript 技術手冊第 5 章
JavaScript 技術手冊第 5 章JavaScript 技術手冊第 5 章
JavaScript 技術手冊第 5 章
 
CH09:Collection與Map
CH09:Collection與MapCH09:Collection與Map
CH09:Collection與Map
 
由一个简单的程序谈起――之五(精华)
由一个简单的程序谈起――之五(精华)由一个简单的程序谈起――之五(精华)
由一个简单的程序谈起――之五(精华)
 
第06章 树和二叉树(java版)
第06章  树和二叉树(java版)第06章  树和二叉树(java版)
第06章 树和二叉树(java版)
 
JAVA内存泄漏及诊断
JAVA内存泄漏及诊断JAVA内存泄漏及诊断
JAVA内存泄漏及诊断
 
Javascript 闭包
Javascript 闭包Javascript 闭包
Javascript 闭包
 
安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb
 
Hibernate的高级操作
Hibernate的高级操作Hibernate的高级操作
Hibernate的高级操作
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典
 
Struts学习笔记
Struts学习笔记Struts学习笔记
Struts学习笔记
 
MySQL和IO(上)
MySQL和IO(上)MySQL和IO(上)
MySQL和IO(上)
 

Viewers also liked

Comsense Company Profile
Comsense Company ProfileComsense Company Profile
Comsense Company ProfileSagar Babar
 
Esp2solr eurocon-2011-presentation-111021215049-phpapp02
Esp2solr eurocon-2011-presentation-111021215049-phpapp02Esp2solr eurocon-2011-presentation-111021215049-phpapp02
Esp2solr eurocon-2011-presentation-111021215049-phpapp02TNR Global
 
Powert pointbarcelona
Powert pointbarcelonaPowert pointbarcelona
Powert pointbarcelona
maherin
 
Virtual event trends i
Virtual event trends   iVirtual event trends   i
Virtual event trends ivirtuence.com
 
Alzheimer
AlzheimerAlzheimer
Alzheimer
maherin
 
our virtual event process
our virtual event processour virtual event process
our virtual event process
virtuence.com
 
what is virtual event?
what is virtual event?what is virtual event?
what is virtual event?
virtuence.com
 
understanding virtual event
understanding virtual eventunderstanding virtual event
understanding virtual eventvirtuence.com
 
our virtual event advantage
our virtual event advantageour virtual event advantage
our virtual event advantagevirtuence.com
 
Robots presentation
Robots presentationRobots presentation
Robots presentationaroobkazim
 

Viewers also liked (11)

Comsense Company Profile
Comsense Company ProfileComsense Company Profile
Comsense Company Profile
 
Esp2solr eurocon-2011-presentation-111021215049-phpapp02
Esp2solr eurocon-2011-presentation-111021215049-phpapp02Esp2solr eurocon-2011-presentation-111021215049-phpapp02
Esp2solr eurocon-2011-presentation-111021215049-phpapp02
 
Powert pointbarcelona
Powert pointbarcelonaPowert pointbarcelona
Powert pointbarcelona
 
Virtual event trends i
Virtual event trends   iVirtual event trends   i
Virtual event trends i
 
Alzheimer
AlzheimerAlzheimer
Alzheimer
 
our virtual event process
our virtual event processour virtual event process
our virtual event process
 
what is virtual event?
what is virtual event?what is virtual event?
what is virtual event?
 
understanding virtual event
understanding virtual eventunderstanding virtual event
understanding virtual event
 
our virtual event advantage
our virtual event advantageour virtual event advantage
our virtual event advantage
 
Presentation on robotics
Presentation on robotics Presentation on robotics
Presentation on robotics
 
Robots presentation
Robots presentationRobots presentation
Robots presentation
 

Similar to NHibernate分享(1) share

Hibernate教程
Hibernate教程Hibernate教程
Hibernate教程
Shilong Sang
 
An introduce to n hibernate (part 1) pub
An introduce to n hibernate (part 1) pubAn introduce to n hibernate (part 1) pub
An introduce to n hibernate (part 1) pubjiangxu
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料yiditushe
 
Java面试笔试题大汇总
Java面试笔试题大汇总Java面试笔试题大汇总
Java面试笔试题大汇总yiditushe
 
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese Version
Frank S.C. Tseng
 
基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展Sky Jian
 
My sql管理基础 李春_v2
My sql管理基础 李春_v2My sql管理基础 李春_v2
My sql管理基础 李春_v2
Pickup Li
 
Altibase管理培训 管理篇
Altibase管理培训 管理篇Altibase管理培训 管理篇
Altibase管理培训 管理篇小新 制造
 
Mysql HandleSocket技术在SNS Feed存储中的应用
Mysql HandleSocket技术在SNS Feed存储中的应用Mysql HandleSocket技术在SNS Feed存储中的应用
Mysql HandleSocket技术在SNS Feed存储中的应用
iammutex
 
3 hibernate映射元素和类型
3 hibernate映射元素和类型3 hibernate映射元素和类型
3 hibernate映射元素和类型Zelin Wang
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程yiditushe
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程appollo0312
 
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
mysqlops
 
构建基于Lamp的网站架构
构建基于Lamp的网站架构构建基于Lamp的网站架构
构建基于Lamp的网站架构Cosey Lee
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲ArBing Xie
 
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章浒 刘
 
基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Betazhu02
 
基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta
fulin tang
 

Similar to NHibernate分享(1) share (20)

Hibernate教程
Hibernate教程Hibernate教程
Hibernate教程
 
Exodus2 大局观
Exodus2 大局观Exodus2 大局观
Exodus2 大局观
 
An introduce to n hibernate (part 1) pub
An introduce to n hibernate (part 1) pubAn introduce to n hibernate (part 1) pub
An introduce to n hibernate (part 1) pub
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
 
Java面试笔试题大汇总
Java面试笔试题大汇总Java面试笔试题大汇总
Java面试笔试题大汇总
 
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese Version
 
基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展
 
My sql管理基础 李春_v2
My sql管理基础 李春_v2My sql管理基础 李春_v2
My sql管理基础 李春_v2
 
Altibase管理培训 管理篇
Altibase管理培训 管理篇Altibase管理培训 管理篇
Altibase管理培训 管理篇
 
Aswan&hump
Aswan&humpAswan&hump
Aswan&hump
 
Mysql HandleSocket技术在SNS Feed存储中的应用
Mysql HandleSocket技术在SNS Feed存储中的应用Mysql HandleSocket技术在SNS Feed存储中的应用
Mysql HandleSocket技术在SNS Feed存储中的应用
 
3 hibernate映射元素和类型
3 hibernate映射元素和类型3 hibernate映射元素和类型
3 hibernate映射元素和类型
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
 
构建基于Lamp的网站架构
构建基于Lamp的网站架构构建基于Lamp的网站架构
构建基于Lamp的网站架构
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
 
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章
 
基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta
 
基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta
 

NHibernate分享(1) share