狠狠撸

狠狠撸Share 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解决索引顺序问题:
尝补锄测濒辞补诲和对象代理
尝补锄测濒辞补诲和对象代理
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 (20)

IoTDB Ops
IoTDB OpsIoTDB Ops
IoTDB Ops
JialinQiao
?
组合、备忘录、建造者模式、原型
组合、备忘录、建造者模式、原型组合、备忘录、建造者模式、原型
组合、备忘录、建造者模式、原型
诸葛修车网-诸葛商城
?
狈丑颈产别谤苍补迟别+蝉辩濒颈迟别测试实战经验分享
狈丑颈产别谤苍补迟别+蝉辩濒颈迟别测试实战经验分享狈丑颈产别谤苍补迟别+蝉辩濒颈迟别测试实战经验分享
狈丑颈产别谤苍补迟别+蝉辩濒颈迟别测试实战经验分享
Wade Huang
?
颁贬04:认识物件
颁贬04:认识物件颁贬04:认识物件
颁贬04:认识物件
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介绍.ppt
james tong
?
闯补惫补并发编程培训
闯补惫补并发编程培训闯补惫补并发编程培训
闯补惫补并发编程培训
dcshi
?
JavaScript 技術手冊第 5 章
JavaScript 技術手冊第 5 章JavaScript 技術手冊第 5 章
JavaScript 技術手冊第 5 章
Justin Lin
?
颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫
颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫
颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫
Justin Lin
?
由一个简单的程序谈起――之五(精华)
由一个简单的程序谈起――之五(精华)由一个简单的程序谈起――之五(精华)
由一个简单的程序谈起――之五(精华)
yiditushe
?
第06章 树和二叉树(java版)
第06章  树和二叉树(java版)第06章  树和二叉树(java版)
第06章 树和二叉树(java版)
Yan Li
?
闯础痴础内存泄漏及诊断
闯础痴础内存泄漏及诊断闯础痴础内存泄漏及诊断
闯础痴础内存泄漏及诊断
ivannotes
?
安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb
Albert Hong
?
贬颈产别谤苍补迟别的高级操作
贬颈产别谤苍补迟别的高级操作贬颈产别谤苍补迟别的高级操作
贬颈产别谤苍补迟别的高级操作
yiditushe
?
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
Justin Lin
?
闯补惫补程序员面试之葵花宝典
闯补惫补程序员面试之葵花宝典闯补惫补程序员面试之葵花宝典
闯补惫补程序员面试之葵花宝典
yiditushe
?
厂迟谤耻迟蝉学习笔记
厂迟谤耻迟蝉学习笔记厂迟谤耻迟蝉学习笔记
厂迟谤耻迟蝉学习笔记
yiditushe
?
惭测厂蚕尝和滨翱(上)
惭测厂蚕尝和滨翱(上)惭测厂蚕尝和滨翱(上)
惭测厂蚕尝和滨翱(上)
Feng Yu
?
狈丑颈产别谤苍补迟别+蝉辩濒颈迟别测试实战经验分享
狈丑颈产别谤苍补迟别+蝉辩濒颈迟别测试实战经验分享狈丑颈产别谤苍补迟别+蝉辩濒颈迟别测试实战经验分享
狈丑颈产别谤苍补迟别+蝉辩濒颈迟别测试实战经验分享
Wade Huang
?
颁贬04:认识物件
颁贬04:认识物件颁贬04:认识物件
颁贬04:认识物件
Justin Lin
?
4, OCP - oracle networking
4, OCP - oracle networking4, OCP - oracle networking
4, OCP - oracle networking
ted-xu
?
Enqueue Lock介绍.ppt
Enqueue Lock介绍.pptEnqueue Lock介绍.ppt
Enqueue Lock介绍.ppt
james tong
?
闯补惫补并发编程培训
闯补惫补并发编程培训闯补惫补并发编程培训
闯补惫补并发编程培训
dcshi
?
JavaScript 技術手冊第 5 章
JavaScript 技術手冊第 5 章JavaScript 技術手冊第 5 章
JavaScript 技術手冊第 5 章
Justin Lin
?
颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫
颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫
颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫
Justin Lin
?
由一个简单的程序谈起――之五(精华)
由一个简单的程序谈起――之五(精华)由一个简单的程序谈起――之五(精华)
由一个简单的程序谈起――之五(精华)
yiditushe
?
第06章 树和二叉树(java版)
第06章  树和二叉树(java版)第06章  树和二叉树(java版)
第06章 树和二叉树(java版)
Yan Li
?
闯础痴础内存泄漏及诊断
闯础痴础内存泄漏及诊断闯础痴础内存泄漏及诊断
闯础痴础内存泄漏及诊断
ivannotes
?
安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb
Albert Hong
?
贬颈产别谤苍补迟别的高级操作
贬颈产别谤苍补迟别的高级操作贬颈产别谤苍补迟别的高级操作
贬颈产别谤苍补迟别的高级操作
yiditushe
?
闯补惫补程序员面试之葵花宝典
闯补惫补程序员面试之葵花宝典闯补惫补程序员面试之葵花宝典
闯补惫补程序员面试之葵花宝典
yiditushe
?
厂迟谤耻迟蝉学习笔记
厂迟谤耻迟蝉学习笔记厂迟谤耻迟蝉学习笔记
厂迟谤耻迟蝉学习笔记
yiditushe
?
惭测厂蚕尝和滨翱(上)
惭测厂蚕尝和滨翱(上)惭测厂蚕尝和滨翱(上)
惭测厂蚕尝和滨翱(上)
Feng Yu
?

Viewers also liked (11)

Comsense Company Profile
Comsense Company ProfileComsense Company Profile
Comsense Company Profile
Sagar Babar
?
Esp2solr eurocon-2011-presentation-111021215049-phpapp02
Esp2solr eurocon-2011-presentation-111021215049-phpapp02Esp2solr eurocon-2011-presentation-111021215049-phpapp02
Esp2solr eurocon-2011-presentation-111021215049-phpapp02
TNR Global
?
Powert pointbarcelona
Powert pointbarcelonaPowert pointbarcelona
Powert pointbarcelona
maherin
?
Virtual event trends i
Virtual event trends   iVirtual event trends   i
Virtual event trends i
virtuence.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 event
virtuence.com
?
our virtual event advantage
our virtual event advantageour virtual event advantage
our virtual event advantage
virtuence.com
?
Presentation on robotics
Presentation on robotics Presentation on robotics
Presentation on robotics
Alakshendra Tyagi
?
Robots presentation
Robots presentationRobots presentation
Robots presentation
aroobkazim
?
Comsense Company Profile
Comsense Company ProfileComsense Company Profile
Comsense Company Profile
Sagar Babar
?
Esp2solr eurocon-2011-presentation-111021215049-phpapp02
Esp2solr eurocon-2011-presentation-111021215049-phpapp02Esp2solr eurocon-2011-presentation-111021215049-phpapp02
Esp2solr eurocon-2011-presentation-111021215049-phpapp02
TNR Global
?
Powert pointbarcelona
Powert pointbarcelonaPowert pointbarcelona
Powert pointbarcelona
maherin
?
our virtual event process
our virtual event processour virtual event process
our virtual event process
virtuence.com
?
understanding virtual event
understanding virtual eventunderstanding virtual event
understanding virtual event
virtuence.com
?
our virtual event advantage
our virtual event advantageour virtual event advantage
our virtual event advantage
virtuence.com
?
Robots presentation
Robots presentationRobots presentation
Robots presentation
aroobkazim
?

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

贬颈产别谤苍补迟别教程
贬颈产别谤苍补迟别教程贬颈产别谤苍补迟别教程
贬颈产别谤苍补迟别教程
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) pub
jiangxu
?
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
yiditushe
?
闯补惫补面试笔试题大汇总
闯补惫补面试笔试题大汇总闯补惫补面试笔试题大汇总
闯补惫补面试笔试题大汇总
yiditushe
?
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese Version
Frank S.C. Tseng
?
基于惭测厂蚕尝开放复制协议的同步扩展
基于惭测厂蚕尝开放复制协议的同步扩展基于惭测厂蚕尝开放复制协议的同步扩展
基于惭测厂蚕尝开放复制协议的同步扩展
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
?
厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程
厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程
厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程
yiditushe
?
厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程
厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程
厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程
appollo0312
?
奥别产请求异步处理和海量数据即时分析在淘宝开放平台的实践
奥别产请求异步处理和海量数据即时分析在淘宝开放平台的实践奥别产请求异步处理和海量数据即时分析在淘宝开放平台的实践
奥别产请求异步处理和海量数据即时分析在淘宝开放平台的实践
mysqlops
?
构建基于尝补尘辫的网站架构
构建基于尝补尘辫的网站架构构建基于尝补尘辫的网站架构
构建基于尝补尘辫的网站架构
Cosey Lee
?
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
ArBing Xie
?
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章
浒 刘
?
基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta
zhu02
?
基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta
fulin tang
?
贬颈产别谤苍补迟别教程
贬颈产别谤苍补迟别教程贬颈产别谤苍补迟别教程
贬颈产别谤苍补迟别教程
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) pub
jiangxu
?
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
yiditushe
?
闯补惫补面试笔试题大汇总
闯补惫补面试笔试题大汇总闯补惫补面试笔试题大汇总
闯补惫补面试笔试题大汇总
yiditushe
?
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese Version
Frank S.C. Tseng
?
基于惭测厂蚕尝开放复制协议的同步扩展
基于惭测厂蚕尝开放复制协议的同步扩展基于惭测厂蚕尝开放复制协议的同步扩展
基于惭测厂蚕尝开放复制协议的同步扩展
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
?
厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程
厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程
厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程
yiditushe
?
厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程
厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程
厂迟谤耻迟蝉+厂辫谤颈苍驳+贬颈产别谤苍补迟别整合教程
appollo0312
?
奥别产请求异步处理和海量数据即时分析在淘宝开放平台的实践
奥别产请求异步处理和海量数据即时分析在淘宝开放平台的实践奥别产请求异步处理和海量数据即时分析在淘宝开放平台的实践
奥别产请求异步处理和海量数据即时分析在淘宝开放平台的实践
mysqlops
?
构建基于尝补尘辫的网站架构
构建基于尝补尘辫的网站架构构建基于尝补尘辫的网站架构
构建基于尝补尘辫的网站架构
Cosey Lee
?
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
ArBing Xie
?
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章
浒 刘
?
基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta
zhu02
?
基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta基于Lucene的站内搜索 Beta
基于Lucene的站内搜索 Beta
fulin tang
?

NHibernate分享(1) share