NHibernate是一个面向.NET环境的对象/
关系数据库映射工具。对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。
简介
在今日的企业环境中,把
面向对象的软件和关系数据库一起使用可能是相当麻烦和浪费时间的.NHibernate不仅仅管理.NET类到数据库表的映射(包括.NET 数据类型到
SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和
ADO.NET处理数据的时间。
NHibernate的目标主要是用于与
数据持久化相关的编程任务,能够使开发人员从原来枯燥的SQL语句的编写中解放出来,解放出来的精力可以让开发人员投入到业务逻辑的实现上。对于以数据为中心的程序,开发人员往往是在数据库中使用
存储过程来实现
商业逻辑,这种情况下NHibernate可能不是最好的解决方案,但对于那些基于.NET,并且能够实现OO业务模型和商业逻辑的中间层应用,NHibernate是最有用的。NHibernate可以帮助用户消除或者包装那些针对特定厂商的SQL代码,并且帮用户把
结果集从表格式的表示形式转换成一系列的对象。
Hibernate是一个目前应用的最广泛的开放源代码的
对象关系映射框架,它对Java的JDBC(类似于ADO.Net)进行了非常轻量级的对象封装,使得程序员可以随心所欲的使用对象编程思维来操纵数据库,目前在国内Java开发界已经颇为流行,Hibernate+Spring往往是很多Java公司招聘的要求。而NHibernate,顾名思义,如同NUnit,NAnt一样,是基于.Net的Hibernate实现,但是目前介绍NHibernate的资料非常少,缺少一个系统完整的教程来全面的展现和深入NHibernate,而且现在NHibernate的文档又残缺不全,少的可怜,很多NHibernate的学习者往往都是通过Hibernate的文档来学习,但是毕竟不是所有的.Net开发者都熟悉Java,也不是所有的人都有精力有时间去学习Java。
NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库。Nhibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化工具。
NHibernate 从数据库底层来持久化你的.Net 对象到
关系型数据库。NHibernate 为你处理这些,远胜于你不得不写SQL去从数据库存取对象。你的代码仅仅和对象关联,NHibernat 自动产生SQL语句,并确保对象提交到正确的表和字段中去。
体系结构
NHibernate体系结构如图1所示。它体现了NHibernate如何使用数据库和配置文件数据来为应用程序提供持久化服务(和持久化的对象)。
SessionFactory(NHibernate.IsessionFactory):它是Session的工厂,是ConnectionProvider的客户。可以持有一个可选的(第二级)
数据缓存,可以在进程级别或集群级别保存的可以在事物中重用的数据。
会话(NHibernate.ISession):
单线程,生命期较短的对象,代表应用程序和持久化层之间的一次对话。封装了一个ADO.NET连接,也是Transaction的工厂。保存有必需的(第一级)持久化对象的缓存,用于遍历对象图,或者通过
标识符查找对象。
持久化对象(Persistent)及其集合(Collections):生命期较短的单线程的对象,包含了持久化状态和商业功能。这些可能是普通的对象,唯一特别的是现在从属于且仅从属于一个Session。一旦Session被关闭,它们都将从Session中取消联系,可以在任何程序层自由使用(比如,直接作为传送到表现层的
DTO,数据传输对象)。
临时对象(Transient Object)及其集合(Collection):目前没有从属于一个Session的
持久化类的实例。这些可能是刚刚被程序实例化,还没有来得及被持久化,或者是被一个已经关闭的Session实例化。
事务Transaction (NHibernate.ITransaction):(可选)单
线程,生命期较短的对象,应用程序用其来表示一批工作的
原子操作,它是底层的ADO.NET事务的抽象。一个Session在某些情况下可能跨越多个Transaction事务。
ConnectionProvider(NHibernate.Connection.ConnectionProvider):(可选)ADO.NET连接的工厂。从底层的IDbConnection抽象而来。对应用程序不可见,但可以被开发者扩展/实现。
TransactionFactory(net.sf.hibernate.TransactionFactory):(可选)
事务实例的工厂。对应用程序不可见,但可以被开发者扩展/实现。
持久化类
持久化类是应用程序用来解决商业问题的类(比如,在电子交易程序中的Customer和Order)。持久化类是暂时存在的,实例会被持久性保存于数据库中。
如果这些类符合简单的规则,NHibernate能够工作得最好,这些规则就是Plain Old CLR Object(POCO,简单传统CLR对象)编程模型。
POCO简单示例(用一个类描述一只猫)如下:
public class Cat
{
private string _name; // 名字
private DateTime _birthdate; // 出生日期
private Cat _mate; // 猫的配对
private Set _kittens; // 猫仔
private Color _color; // 颜色
private char _sex; // 性别
private float _weight; // 体重
{
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访问器。用访问器来替代直接访问字段是个好习惯。也可以通过字段(field)来使用NHibernate。属性不一定需要声明为public的。NHibernate可以对
default、
protected、
internal或private的属性执行持久化.
实现一个默认的
构造方法(constructor):Cat有一个显式的无参数
默认构造方法。所有的
持久化类都必须具有一个默认的构造方法(可以不是public的),这样NHibernate就可以使用Constructor.Invoke()来实例化它们.
提供一个
标识属性(identifier property)(可选).
建议使用不是sealed的类(可选).
映射
对象和关系数据库之间的映射是用一个
XML文档(XML document)来定义的。这个映射文档被设计为易读的,并且可以手工修改。映射语言是以.NET为中心的,意味着映射是按照
持久化类的定义来创建的,而非表的定义。在Hibernate中XML映射文档可以手动定义,也有一些工具来辅助生成,包括
Xdoclet、
Middlegen和
AndroMDA,但是在NHibernate文档中并没有上述的
辅助工具,不过可以采用MyGeneration这样的代码生成工具来生成XML配置文档。
虽然NHibernate目前不是非常的成熟,还没有达到实用化的水平,它经常在负荷有些大的时候崩溃,但是它脱胎于在Java社区有着巨大影响力的Hibernate,而且NHibernate在实际应用方面确实体现出了它的优势,基于上述原因NHibernate一定会被越来越多的开发人员所接受,而且一定会被标准化。