现在的位置: 首页 > 综合 > 正文

NHibernate和Spring.Net框架介绍(一)

2013年07月29日 ⁄ 综合 ⁄ 共 5461字 ⁄ 字号 评论关闭

在开始介绍NHibernate和Spirng.Net之前,有必要先介绍一下相对应的两个Java开源框架Hibernate和Spring。它们是在Java的Web应用开发中已经很成熟的框架,而前者则是两个还不成熟的.Net中的开源框架,它们在SourceForge开源社区中正在得到不断的补充和完善,其最终目标就是要在.NET环境下实现Hibernate和 Spring的全部    特性。

Spring是一个解决了许多在J2EE开发中常见问题的强大框架,它提供了管理业务对象的一致方法并且鼓励注入对接口编程而不是对类编程的良好习惯。Spring提供了唯一的数据访问抽象,包括简单和有效率的JDBC框架,极大改进了效率并且减少了可能的错误。Spring的数据访问架构还集成了Hibernate和其他O/R mapping解决方案。Spring还提供了唯一的事务管理抽象,它为各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。 Spring提供了一个用标准Java语言编写的AOP框架,它给POJO提供了声明式的事务管理和其他企业事务。这个框架足够强大,使得应用程序能够抛开EJB的复杂性,同时享受着和传统EJB相关的关键服务。Spring还提供了可以和IoC容器集成的强大而灵活的MVC Web框架。

Hibernate是一个开放源代码的对象关系映射(Object- Relation Mapping,ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲地使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。鉴于Hibernate在Java社区巨大的影响力,它其实已经成为Java社区的持久层技术事实上的标准。

基于.NET的开发框架NHibernate和Spring.Net分别来源于上述提到的两个Java框架,框架结构和实现功能都基本一致,只不过应用环境从Java转到了.NET。到目前为止NHibernate和 Spring.NET仍然处于完善阶段,不是特别成熟稳定,但是具有Hibernate和Spring的强大背景,使得它们有着很光明的未来。事实上,现在NHibernate和Spring.NET正在被越来越多的开发人员所熟知,并且有些开发人员已经开始尝试在自己的项目中使用这两个框架。

1.5.1    企业开发框架的优势


在当今的企业环境中,开发企业应用程序是一个相当繁琐、浪费时间的过程,为了让这个过程变得相对简单且高效,一些开源的、轻量级的框架正在被广泛的使用,比如Java下的Structs、Spring、Hibernate、 iBATIS以及.NET下的Spring.Net和NHibernate等。

它们的广泛使用降低了系统开发的复杂度,弱化了系统各模块间的耦合程度,缩短了开发周期,增强了系统的可维护性和可扩展性。“站在巨人的肩膀上”是牛顿的一句名言,它已经成为google学术搜索引擎的座右铭,同样也为笔者所推崇。笔者对.Net软件开发平台的设想如下,采用开源的ORM框架做数据持久层,ASP.NET没有合适的Web层框架,采用Asp.Net的Code- behind方式编写代码,数据持久层同Web表现层之间的连接采用IoC容器。

衡量了多种框架以后,最终笔者推荐采用的技术架构就是NHibernate+Spring.Net+ASP.NET,下面对NHibernate和Spring.net分别进行比较详细的介绍。

1.5.2    NHibernate介绍


在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦和浪费时间的。NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。

NHibernate不仅仅管理.NET类到数据库表的映射(包括.NET 数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和ADO.NET处理数据的时间。

NHibernate的目标主要是用于与数据持久化相关的编程任务,能够使开发人员从原来枯燥的SQL语句的编写中解放出来,解放出来的精力可以让开发人员投入到业务逻辑的实现上。对于以数据为中心的程序,开发人员往往是在数据库中使用存储过程来实现商业逻辑,这种情况下NHibernate可能不是最好的解决方案,但对于那些基于.NET,并且能够实现OO业务模型和商业逻辑的中间层应用,NHibernate是最有用的。NHibernate可以帮助用户消除或者包装那些针对特定厂商的SQL代码,并且帮用户把结果集从表格式的表示形式转换成一系列的对象。

1.NHibernate体系结构


NHibernate体系结构如图1-51所示。它体现了NHibernate如何使用数据库和配置文件数据来为应用程序提供持久化服务(和持久化的对象)。

在NHibernate全面解决体系中,NHibernate运行时体系结构的细节如图1-52所示。

diyblPic
       diyblPic


       图1-51    NHibernate体系结构                        图1-52    NHibernate详细体系结构

diyblPic
      SessionFactory(NHibernate.IsessionFactory):它是Session的工厂,是 ConnectionProvider的客户。可以持有一个可选的(第二级)数据缓存,可以在进程级别或集群级别保存的可以在事物中重用的数据。


diyblPic
      会话(NHibernate.ISession):单线程,生命期较短的对象,代表应用程序和持久化层之间的一次对话。封装了一个ADO.NET连接,也是Transaction的工厂。保存有必需的(第一级)持久化对象的缓存,用于遍历对象图,或者通过标识符查找对象。


diyblPic
      持久化对象(Persistent)及其集合(Collections):生命期较短的单线程的对象,包含了持久化状态和商业功能。这些可能是普通的对象,唯一特别的是现在从属于且仅从属于一个Session。一旦Session被关闭,它们都将从Session中取消联系,可以在任何程序层自由使用(比如,直接作为传送到表现层的DTO,数据传输对象)。


diyblPic
      临时对象(Transient Object)及其集合(Collection):目前没有从属于一个Session的持久化类的实例。这些可能是刚刚被程序实例化,还没有来得及被持久化,或者是被一个已经关闭的Session实例化。


diyblPic
      事务Transaction (NHibernate.ITransaction):(可选)单线程,生命期较短的对象,应用程序用其来表示一批工作的原子操作,它是底层的 ADO.NET事务的抽象。一个Session在某些情况下可能跨越多个Transaction事务。


diyblPic
      ConnectionProvider(NHibernate.Connection.ConnectionProvider):(可选)ADO.NET连接的工厂。从底层的IDbConnection抽象而来。对应用程序不可见,但可以被开发者扩展/实现。


diyblPic
      TransactionFactory(net.sf.hibernate.TransactionFactory):(可选)事务实例的工厂。对应用程序不可见,但可以被开发者扩展/实现。


2.持久化类


持久化类是应用程序用来解决商业问题的类(比如,在电子交易程序中的Customer和Order)。持久化类是暂时存在的,实例会被持久性保存于数据库中。

如果这些类符合简单的规则,NHibernate能够工作得最好,这些规则就是Plain Old CLR Object(POCO,简单传统CLR对象)编程模型。

POCO简单示例(用一个类描述一只猫)如下:

#001      public class Cat

#002      {

#003         private long _id;                    // 标识符

#004         private string _name;               // 名字

#005         private DateTime _birthdate;          // 出生日期

#006         private Cat _mate;                  // 猫的配对

#007         private Set _kittens;                   // 猫仔

#008         private Color _color;                 // 颜色

#009         private char _sex;                // 性别

#010         private float _weight;               // 体重

#011             public long Id                // 标识符属性

#012        {    get { return _id; }

#013                set { _id = value; }

#014         public string Name                // 名字属性

#015             {    get { return _name; }

#016            set { _name = value; }}

#017         public DateTime Birthdate            // 出生日期属性

#018             {    get { return _birthdate; }

#019                set { _birthdate = value; }}

#020         public Cat Mate                   // 猫的配对属性

#021             {    get { return _mate; }

#022           set { _mate = value; }}

#023         public Set Kittens                // 猫仔属性

#024             {    get { return _kittens; }

#025                set { _kittens = value; }}

#026         public Color Color                // 颜色属性

#027             {    get { return _color; }

#028                set { _color = value; }}

#029         public char Sex                   // 性别属性

#030             {    get { return _sex; }

#031                set { _sex = value; }}

#032         public float Weight               // 体重属性

#033             {    get { return _weight; }

#034                set { _weight = value; }}

#035      }

有4条主要的规则如下。

diyblPic
      为持久化字段声明访问器(getters和setters)。


diyblPic
      Cat为它的所有可持久化字段声明了getters和setters访问器。用访问器来替代直接访问字段是个好习惯。也可以通过字段(field)来使用 NHibernate。属性不一定需要声明为public的。NHibernate可以对default、protected、internal或 private的属性执行持久化。


diyblPic
      实现一个默认的构造方法(constructor):Cat有一个显式的无参数默认构造方法。所有的持久化类都必须具有一个默认的构造方法(可以不是 public的),这样NHibernate就可以使用Constructor.Invoke()来实例化它们。


diyblPic
      提供一个标识属性(identifier property)(可选)。


diyblPic
      建议使用不是sealed的类(可选)。


3.NHibernate映射


对象和关系数据库之间的映射是用一个XML文档(XML document)来定义的。这个映射文档被设计为易读的,并且可以手工修改。映射语言是以.NET为中心的,意味着映射是按照持久化类的定义来创建的,而非表的定义。在Hibernate中XML映射文档可以手动定义,也有一些工具来辅助生成,包括Xdoclet、Middlegen和 AndroMDA,但是在NHibernate文档中并没有上述的辅助工具,不过可以采用MyGeneration这样的

抱歉!评论已关闭.