文档库 最新最全的文档下载
当前位置:文档库 › NHibernate

NHibernate

NHibernate
NHibernate

收稿日期:2005-07-14;修返日期:2005-09-10基金项目:国家自然科学基金资助项目(60273040)

对象/关系映射在.NET 框架下的应用研究

*

孙栋海,宋顺林

(江苏大学计算机科学与通信工程学院,江苏镇江212013)

摘 要:基于面向对象的模型与基于关系数学理论之间的阻抗不匹配使得处理数据时无法完整体现对象的特性。对象关系映射提供了沟通对象与关系数据库的桥梁。分析比较了实体类映射到数据表时的策略,重点研究了N Hiberna te 对象关系映射框架的应用与优势。

关键词:面向对象;关系数据库;对象关系映射;NHibernat e

中图法分类号:TP311 文献标识码: A 文章编号:1001-3695(2006)08-0058-03

Resea rch a nd Applicat ion of Object/Rela tional M apping in .N ET Fr am ew ork

S UN Dong -hai,S ON G S hun-lin

(S chool of Computer S cience &Telecommunications,J iangsu Univer sity,Zhenjiang Jiangsu 212013,China)

Abst ract :The im peda nce m ism at ch bet ween paradigm s ba sed on object-oriented theory and relat iona l t heory m ake it im pos si-ble to reflect the chara ct eristic of object.Object/Relat ional M apping provides a bridg e betw een them .The st rat egies of m a p-ping entit y clas ses to ta bles are ana lyz ed a nd com pared.The applicat ion and adv anta ge of NH ibernat e fram ework a re especially

introduced.

Key wo rds:Object-Orient ed(OO);Rela tiona l Da ta base;Object/Rela tional M apping;NHibernat e 如今大多数编程语言是基于面向对象的模型,该模型很好地抽象了真实世界问题域,对现实数据实现了易于理解的自然描述。对于实际应用中需要处理的数据,现在的方法多数是采用关系型数据库。但是面向对象的模型遵循的一些软件工程原理如封装、关联、聚合、继承、多态等与关系数据库遵循的关系数学理论产生的不匹配

[1]

使得我们在持久化对象过程中遇

到了许多困难。在面向对象的开发中,数据访问层最基本的数据库操作包括插入对象,删除对象,更新对象和查询对象。几乎所有的项目开发均需要实现这些原子操作,而这些操作在项目开发中都很类似。显然在每个项目中这种重复而具备相同模式的代码是一种明显的浪费。这就催生了Object/Relat ional M apping (O/R Ma pping)技术的产生。

1 O/R M apping 框架概述

使用面向对象的语言访问关系数据库是最简单,也是最糟糕的办法,就是在业务类中直接编写S QL 语句。这样写的好处在于代码的编写效率高,对于非常小型的程序或原型,采用这种方法也未尝不可。但是缺点是业务类与关系数据库结构直接耦合,这意味着即使是很小的改变(诸如重命名列或是移植到另一种数据库),都会造成系统源码级的修改

[2]

比这种方法稍进步些的方法是:在业务层与数据库之间增加数据访问层,封装与数据库相关的各种操作。如此一来,业务类便脱离了S QL 语句,系统的整体结构也更为清晰。这也是当前软件开发过程中的主流方法。但是这种方法仍然不能使面向对象的开发者完全摆脱数据库的束缚,数据库发生变动之后,仍然需要改写和重新编译数据类。

本文将讨论的方法是:在业务层与数据库之间构建一个持久层,使得业务类需要的数据透明地在数据库中进行存取,面向对象的开发者似乎根本感觉不到数据库的存在,只要将需要存取的数据通知持久层,其他的事情都由持久层的内部机制来实现。如果数据库发生某种变化,持久层则负责对业务层屏蔽这些变化,为业务类提供高度统一的数据访问模式。O/R Mapping 框架工作在业务层和持久机制(本文限定于关系数据库)之间,它为业务逻辑包装了数据类的持久化实现,保护应用开发者不受底层变化的影响[3]。使得我们可以在业务层完全专注于问题域,而无需理会繁杂的数据库操作问题,只需发出简单的Sa ve,Ret rieve,Delete 等命令,O /R Ma pping 框架便自动将对对象的操作映射为对相关的数据表和字段等的操作;对于持久机制而言,它也屏蔽了面向对象的特征,使得数据库管理员可以专注于数据库的管理与维护,而不必过分担心其一举一动会导致应用程序崩溃。

2 O/R M apping 中类映射到数据表的策略

根据抽象对象与关系数据库的特性,O/R Mapping 通过以下几个方面实现:类映射到数据表、类属性映射到数据表列和类之间关系映射为键值[4]。对于面向对象的三大特征:封装、继承和多态,O /R Mapping 都提供了很好的支持。

举例说明继承的映射策略:基类Person 有两个子类St udent 和T eacher,具体关系如图1所示。2.1 映射整个类层次为单个表

类层次的所有类映射为单个数据库表,表中保存所有类(基类、子类)的属性。其中ObjectTy pe 字段用来区分类具体

?85?计算机应用研究2006年

的类。该方法的实现如图2所示。

该方法的优点在于:①实现简单。②易于增加新类,只需为新增的数据增加新的列即可。③支持多态(对象角色发生变化,或存在多重角色时)。④因为数据都在一个表内,所以访问速度较快。⑤报表操作实现简单:表中包含了所有信息。

缺点在于:①增加类层次中的耦合,因为所有的类都直接与表关联。类层次中任何类的变更会导致表的变更,进而影响到同层次中的其他类。②数据库空间存在浪费现象。浪费的程度取决于继承层次的深度[5]。③当角色出现变化时,具体指明它的类别可能很复杂。④随着类层次的延伸,数据表会快速增大。

对于比较简单的应用,继承层次较浅,且角色变换很少时可采用这种策略。

2.2映射每个继承路径为单个表

数据库表包括自身的属性和继承的属性,每个具体的子类包含各自的OID(Object ID),抽象的基类不参与映射。图3描述了该方法的实现。其中,Pers on由于是抽象类,未映射成数据库表;而S tudent、Teacher类映射为相应的表,它们具有各自的主键。

该方法的优点在于:①报表操作实现简单。表中包含具体子类的所有信息。②访问单独的对象的数据时性能良好。

缺点在于:①要修改一个类,不但要修改它映射的表,还需要修改它所有子类映射的表。例如要为Person增加Birthday 属性,就需要在S t udent和Teacher表中都增加这一列数据。②当角色更改时,如一个St udent对象要变为Tea cher对象,这时候就需要把数据拷贝到适当的表中,同时可能需要对对象ID 重新赋值。③难以在支持多重角色时,保持数据的完整性。例如,难以处理一个既是St udent又是Tea cher对象的数据。

当角色变换非常少见时,可以采用这种策略。

2.3映射每个类作为单个表

表中包含特定于该类的属性和OID。类S t udent的数据存放在S tudent和Person两个表中。因此要想取得S t udent的数据就需要连接这两个表。图4描述了该方法的实现。在S t udent和Teacher表中,PersonOID既是主键又是外键,用来保存同Person表的联系。

该方法的优点在于:①这种1∶1映射的方式容易让人理解。②对多态的支持最好,对于对象可能充当的角色仅需要在相应的表中保存记录。③修改基类和增加新类的时候,只需要更改和增加数据表即可。④数据量的增长与对象数量的增长是成比例的。

缺点在于:①数据库中存在大量的表。②由于需要很多的表链接操作,访问数据的效率不甚理想。③除非定义视图,否则很难生成报表。

当角色变换较频繁时,需要采用此策略。

3O/R M apping在.NET中的实现

对于O/R Mapping中的表和持久化类之间的映射,主要有两种方式:①单纯的持久化类映射。表与持久化类之间的映射是通过硬编码的方式写成类,编译后运行的。这种方式用起来直观明了,程序员可以控制的部分多,运行速度快。缺点是如果更改表的字段、类型等,需要直接更改类里面的代码,再编译后才能运行。②通过XML和持久化类一起来实现映射。持久化类映射出来的是实体类,大部分关于类属性的类型、长度、是否能修改、是否可以插入,表字段的类型、长度、是否允许为空等,都通过XML文件来表达。表的映射关系需要改动时,只需修改XML文件部分,持久化类不需要改动及重新编译。现在流行这种方式,它更灵活,耦合性更低。本文将要讨论的N Hi-berna te就是属于这一类。N Hiberna te是一个基于.N ET的O/R 映射对象持久库。它是从J a va下的对象/关系(数据库)持久工具Hibernat e移植过来的。它在.N ET下的O/R Mapping领域获得了较为广泛的支持。

3.1 NHibernat e的特征

(1)透明地提供对象与关系数据库的映射,以统一的接口支持多种数据库,使得数据库之间的移植非常方便。

(2)支持的HQL是一种面向对象的查询语言,它具备继承、关联、多态等特性。它也支持一种直观的、可扩展的条件查询API,但是不支持原生查询。

(3)支持本地事务,使用Transa ct ion对象对.N ET的事务对象(实现了IDbTra nsaction接口的对象)进行了包装。对于长事务目前NHibernat e也支持Versioning和Opt im istic Locking 的实现。

(4)提供了Session Fa ct ory和S ession来解决线程同步问题。S ession F act ory是一个线程安全但开销大的对象,它可被多个线程同时访问;S ession是线程不安全但开销小的对象,只可被一个线程访问。这样N Hibernat e把需要线程共享的东西放在Session Fa ct ory中,不需共享的放在S ession中。

(5)提供全部是基于Hasht able的多级缓存机制,以及类似操作系统“元语”的锁机制,充分考虑了性能和扩展性。

3.2 Nhibernat e核心架构分析

Session和Session Fa ctory是N Hiberna te的核心部分。后者维护到持久机制(数据库)的链接并对它们进行管理,同时还保存着所有持久对象的映射信息。S ession Fa ct ory由C onfig-ura tion.B uildS ess ionFa ct ory创建,这个对象一般使用Singlet on 模式。S ession用于将对象持久化,支持数据库事务,另外还提供了强大的数据加载功能,如图5所示。

其他对象说明:

IConnectionProvider是链接提供者接口,负责与数据进行链接;

Dialect是数据库方言;

CollectionPersister是集合持久化类;

IClassPer sister是类持久化接口,定义了基本的CRUD操作;

Transa ctionFactor y是数据库事务工厂;

IInterceptor是拦截器接口,用于在操作执行时进行一些处理,典型的就是记录操作日志。

?

9

5

?

第8期孙栋海等:对象/关系映射在.N ET框架下的应用研究

图1类及其继承关系

Person

<>PersonOID

objectType

Name Grade

Salary

图2映射整个类层次为单个表

Student <>StudentOID Name Grade

Teacher <>TeacherOID Name Salary

图3

映射每个继承路径为单个表图映射每个类为单个表

3.3NHibernat e实现类映射到数据表策略

用上面举的例子。实际应用中,像生成数据库结构、生成

标准实体类都是有工具可以利用的,那样会大大提高开发效

率。这里为了说明问题暂不采用。

首先,在数据库中建立表结构。采用映射每个继承路径为

单个表的映射策略,建立S tudent和Tea cher两个表。N Hiber-na te需要把实体类和数据表的映射关系写在XML格式的

M apping文件当中。针对S t udent的映射文件如下:

length="20">

length="40"/>

在cla ss标记中指明了实体类及其映射的数据表的名称,

而id标记则指明了数据表的主键,这也是N Hiberna te用来判

断对象唯一性的标志。id中的generat or指定了主键的生成方

式。NHibernat e内部附带了几种不同的标识符生成器,如数据

库本地的顺序生成器、UU ID生成、利用Hi/Lo高低位生成模式

等,本例采用程序自己指定(Assigned)的方法。property标记

指定了实体类的每个属性映射到数据表的哪一列。

映射文件中可以对多态行为、延迟装载、动态更新或插入、

乐观锁定的策略等属性进行指定,这一切持久化策略的更改都

只需要对映射文件作出修改,而应用程序却不需要变化,使得

应用的灵活性和扩展性得到很大的提高。

另外还需要在XML配置文件中添加配置信息:

value="NHiber nate.Dialect.M sS ql2000Dia lect"/>

在配置文件中,指明了数据链接提供者、数据库语言(以S QL S erver2000为例)、数据链接驱动和链接字符串。

配置好数据库链接之后,我们就可以开始利用N Hiberna te

工作了。下面以添加一个S t udent对象为例。

(1)创建一个C onfigurat ion对象:C onfigurat ion对象能够解析所有.N ET对象和后台数据库的映射关系。

Config ura tion cfg=new Configuration();

cfg.AddAssembly("NHibernateSa mple");

Configura tion对象会搜索装配件中任何以hbm.xm l结尾的文件。还有其他方法加载映射文件,但该方式是最简单的。

(2)创建一个S ession对象:IS ess ion对象提供一个到后台数据库的链接,IT ra nsaction对象提供一个可以被N Hiberna te管理的事务。创建会话工厂时,一般来说应该使用一个单例对象来封装会话工厂。

IS essionFactor y factory=cfg.B uildS essionFactor y();

IS ession session=factory.OpenSession();

ITra nsaction tran=session.BeginTransaction();

(3)然后创建一个实体类:

Student stu=new Student();

stu.Id="0001";

https://www.wendangku.net/doc/2010026760.html,="Jim S mith";

stu.Grade="03";

(4)利用S ess ion对象将实体类持久化:session.S ave(stu);

(5)将事务提交并关闭会话:https://www.wendangku.net/doc/2010026760.html,mit();session.Close();

如此一来,类似关于数据库的CRU D操作都可以转换成完全面向对象的方式来实现,可以看到,O/R Mapping技术能够将应用程序逻辑和数据库结构真正有效地解耦,切实提高系统的可移植性和扩展性,更好地满足了日后对系统需求的种种未知的变更,使得系统的可维护性也得到了很大的提高。

4结论

O/R Mapping是面向对象分析设计的产物,也是分层设计要解决的问题之一。它的出现有效地填补了关系数据库理论与面向对象理论之间的鸿沟,为基于数据的种种应用的开发提供了一种稳定、高效、扩展性极佳的解决方案。

在当今的技术条件下,完全的面向对象的数据库产品还有重大技术难题,因而技术成熟的关系数据库依然是企业应用的首选。像NHibernat e这类的对象关系映射框架使我们从开发数据访问层的烦琐又容易出错的劳动中解脱出来,使得应用开发人员根本无须关心持久化的问题,是配合关系数据库与面向对象开发语言开发企业应用的极佳工具。在可以预见的将来, O/R Mapping技术将在.N ET领域中发挥更为重要的作用。

参考文献:

[1]cott W Ambler.M apping Objects to R elat ional Da tabase[E B/OL].ht-

t p://ww w.a https://www.wendangku.net/doc/2010026760.html,/essa ys/m apping Objects.html,2005-06-21.

[2]S cott W Ambler.A Desig n of a Robust Persistence Layer for Relation-

a l Databases[EB/OL].http://www.a https://www.wendangku.net/doc/2010026760.html,/downloads/per-

sistencelayer.pdf,2005-06-21.

[3]J oseph W Yoder,et al.Connecting B usiness Objects to Relational

Database[E B/OL].http://w https://www.wendangku.net/doc/2010026760.html,/~yoder/pa per s/ patterns/PersistentObject/Per sista.pdf,2005-05-09.

[4]何铮,陈志刚.对象/关系映射框架的研究与应用[J].计算机工程

与应用,2003,39(26):188-191.

[5]Wolfgang Keller.Ma pping Objects to Tables:A Patter n Languag e

[EB/OL].http://www.objectar chitects.de/Object Ar chitects/pa-pers/Published/ZippedPapers/mappings04.pdf,2005-05-09.

作者简介:

孙栋海(1980-),男,硕士生,研究方向为数据库技术;宋顺林(1947-),男,教授,研究方向为计算机图形学、软件工程、计算机支持协同设计。

?

6

?计算机应用研究2006年

相关文档