
第2章 Hibernate简介
【本章知识导学】
本章读者将了解到Hibernate的发展历史、产品情况、主要接口以及技术发展趋势,对这项技术的背景有一个简单的了解。
2.1 中间件
在上一章讲到Hibernate是一种工作在应用层和数据层之间,负责进行对象关系映射的持久层中间件。在介绍Hibernate之前,读者应首先来了解什么是中间件以及中间件的分类,从而明确Hibernate作为中间件所承担的职责。
2.1.1 中间件的概念
在没有中间件的时代,应用程序直接与最底层的软件和硬件打交道,如操作系统、网络协议、数据库甚至是内存、硬盘、计算机串口等。越底层的东西越复杂,程序员不得不面对各种问题,如不同的操作系统,复杂的网络环境,数据库的存储格式,数据的一致性问题,系统的性能、安全等等。而这些问题和应用程序是没有直接关系的,并且往往因为底层操作系统、数据库等的变动,程序员不得不重新更改应用程序,消耗了大量的时间和精力,而且使应用程序变得越来越难以维护。于是,有人提出将应用程序所面临的问题进行提炼,在底层软硬件(如操作系统、网络协议和数据库)之上、应用程序之下形成一个可复用的部分,使程序不会因为底层的变动而频繁更改。这一思想便是中间件这类软件后来出现的最初动因。
中间件(Middleware)是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件通常位于操作系统、网络以及数据库之上,用户的应用程序之下,为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。 因此可以将中间件划入基础类软件的范畴,并且它通常具有可复用的特征。中间件的工作原理如图2-1所示。

图2-1 中间件的工作原理
中间件应该具有如下的特点:
● 满足大量应用的需要。
● 运行于多种硬件和操作系统平台。
● 支持分布计算,提供跨网络、硬件和操作系统平台的透明性的应用或服务的交互。
● 支持标准的协议。
● 支持标准的接口。
● 强大的通信功能。
由于标准接口对于可移植性和标准协议对于互操作性的重要性,中间件已成为许多标准化工作的主要部分。对于应用软件开发,中间件的重要程度远远超过了操作系统和网络服务或者数据库系统本身,中间件提供的程序接口定义了一个相对稳定的高层应用环境,不管底层的计算机硬件、系统软件或者数据库软件怎样更新换代,只要将中间件升级更新,并保持中间件对外的接口定义不变,应用软件几乎不需任何修改即可以继续使用。
2.1.2 中间件的分类
中间件所包括的范围十分广泛,针对不同的应用需求有多种各具特色的中间件产品。但至今中间件还没有一个比较准确的定义,因此,在不同的角度或不同的层次上,对中间件的分类也会有所不同。根据中间件在系统中所起的作用和采用的技术不同,我们一般将平台分为以下主要几类:
● 数据库中间件(DM,Database Middleware)
● 远程过程调用中间件(RPC,Remote Procedure Call)
● 面向消息中间件(MOM,Message Oriented Middleware)
● 基于对象请求代理的中间件(ORB,Object Request Broker)
● 事务处理中间件(TPM,Transaction Processing Monitor)
它们可向上层提供不同形式的通信或访问服务,包括数据库存取、同步、排队、订阅发布、交易处理等等,在这些基本的服务之上,可构筑各种应用框架,从而为应用程序提供不同领域的服务,如事务处理监控器、分布数据访问以及对象事务管理器OTM等。中间件为上层应用屏蔽了异构平台的差异,而其上的应用框架又定义了相应领域内的应用的系统结构和标准的服务组件等,程序员只需告诉框架所关心的事件,然后提供处理这些事件的代码。当事件发生时,框架则会自动调用代码。程序员的程序不必关心框架结构、执行流程、对系统级API的调用等,所有这些都由框架负责完成。因此,基于中间件开发的应用具有良好的可扩充性、易管理性、高可用性和可移植性。
下面,针对这几类主要的中间件分别加以简要的介绍。
1.数据库中间件
数据库中间件是目前应用最广泛、技术最成熟的一种中间件。最典型的例子就是ODBC,ODBC是一种基于数据库的中间件标准,它提供了一系列的应用程序接口API,允许应用程序和本地或者异地的数据库进行通信。在多数情况下这些API都是隐藏在开发工具中,不被程序员直接使用。Hibernate实质上也是一种数据库中间件,与ODBC的较接近于底层数据库这一特征相比,它所提供的对象持久化功能更加接近于应用程序层,因为程序员可以在应用程序中直接使用Hibernate提供的各种接口和类,从而能够更加灵活地控制对数据层的访问和对Java对象的操作。
数据库中间件的优点是对数据库操作的灵活,缺点是需要大量的数据通信,不适合对性能要求比较高的处理环境,同时,他对网络要求比较高,当网络发生故障时,系统不能正常工作。
2.远程过程调用中间件
远程过程调用是一种广泛使用的分布式应用程序处理方法。它在客户/服务器计算方面比数据库中间件又迈进了一步。一个应用程序使用RPC来“远程”执行一个位于不同地址空间里的过程,并且从效果上看和执行本地调用相同。事实上,一个RPC应用分为两个部分:服务器和客户端。服务器提供一个或多个远程过程,客户端向服务器发出远程调用。服务器和客户端可以位于同一台计算机,也可以位于不同的计算机,甚至运行在不同的操作系统之上,它们通过网络进行通信。相应的运行支持提供数据转换和通信服务,从而屏蔽不同的操作系统和网络协议。在这里RPC通信是同步的,采用线程可以进行异步调用。
远程过程调用中间件的优点是可以应用到更复杂的客户/服务器的计算环境中,可以实现跨平台的调用,比数据库中间件更加灵活并广泛使用。远程过程调用中间件的缺点是由于是同步通信,所以对网络要求较高,适合小型简单的应用,不适合对异步通信方式有要求的大型的应用程序。
3.面向消息的中间件
面向消息的中间件指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可在分布环境下扩展进程间的通信,并支持多通讯协议、语言、应用程序、硬件和软件平台。目前流行的面向消息的中间件产品有IBM的MQSeries、BEA的MessageQ等。通信程序可在不同的时间运行,程序之间不是在网络上直接相互通话,而是间接地将消息放入消息队列。当消息放入适当的队列时,甚至根本不需要目标程序正在运行;即使目标程序在运行,也不意味着要立即处理该消息。
面向消息的中间件的优点在于能够在客户和服务器之间提供同步和异步的连接,不会占用大量的网络带宽,可以跟踪事务,并且通过将事务存储到磁盘上实现发生网络故障时系统的恢复,因此比较适用于需要在多个进程之间进行可靠的数据传送的分布式环境。面向消息的中间件的缺点在于不支持程序控制的传递。
4.基于对象请求代理的中间件
随着面向对象技术与分布式计算技术的发展,两者相互结合形成了基于对象请求代理的中间件,并发展为当今软件技术的主流方向。目前有两种对象请求代理的标准,分别是CORBA和DCOM。1990年底,对象管理集团OMG首次推出对象管理结构OMA(Object Management Architecture),对象请求代理ORB(Object Request Broker)是这个模型的核心组件。它的作用在于提供一个通信框架,透明地在异构的分布计算环境中传递对象请求。CORBA规范包括了ORB的所有标准接口,而DCOM是基于微软的COM标准。他们都使用接口定义语言IDL做对象接口描述,但各有不同。由于CORBA的目标是实现异构分布环境(不同硬件体系、操作系统、编程语言)下的分布计算,而DCOM却仍局限在Windows平台,因此从这一点上来看,CORBA比DOCM功能强大、稳定、灵活。
总之,基于对象请求代理的中间件从管理和封装的模式上看和远过程调用有些类似,不过对象请求代理可以包含比远过程调用和消息中间件更复杂的信息,并且可以适用于非结构化的或者非关系型的数据。
5.事务处理的中间件
事务处理中间件是一种复杂的中间件产品,是针对复杂环境下分布式应用的速度和可靠性要求而实现的。事务处理中间件最早出现在大型机上,为其提供支持大规模事务处理的可靠运行环境。随着分布计算技术的发展,分布应用系统对大规模的事务处理中间件提出了需求。事务处理中间件界于客户端和服务器之间,进行事务管理与协调、负载平衡、失败恢复等,以提高系统的整体性能。它可以被看作是事务处理应用程序的“操作系统”。从总体上说,事务处理中间件向用户提供一系列的服务,如应用管理、管理控制以及应用程序间的消息传递等。事务处理中间件常见的功能如下:
● 进程管理,包括启动服务器进程、为其分配任务、监控任务执行并对负载进行平衡。
● 事务管理,保证在其监控下的事务处理的原子性、一致性、独立性和持久性。
● 通讯管理,为客户端和服务器之间提供了多种通讯机制,包括请求响应、会话、排队、订阅发布和广播等。
事务处理中间件的优点是能够为大量的客户端提供服务。它在操作系统之上提供一组服务,对客户端请求进行管理并为其分配相应的服务进程,使服务器端在有限的系统资源下能够高效地为大规模的客户提供服务。
2.2 Hibernate简介
Hibernate是一种强大的可提供对象-关系持久化和查询服务的中间件,它可以使程序员依据面向对象的原理开发持久化类,实现对象之间的关联、继承、多态、组合、集合等。Hibernate提供了它特有的数据库查询语言HQL,这种查询语言屏蔽了不同数据库之间的差别,使你可以编写统一的查询语句执行查询。不同于其他持久化解决方案的是Hibernate并没有把SQL的强大功能屏蔽掉,而是仍然兼容SQL,这使你以往的关系技术依然有效。
Hibernate版本更新速度很快,到目前为止有两个阶段性的版本:Hibernate2和Hibernate3,这一点程序员从其Jar文件名便可以看出来。现在最新发布的版本是Hibernate3.2。
Hibernate2系列的最高版本是Hibernate2.1.8,Hibernate3系列在编写本书时的最高版本是Hibernate 3.2.5 GA版,GA也就是General Availability,即推荐广泛使用的版本,但目前使用较多且较稳定的版本是Hibernate 3.1.3或Hibernat 3.1.2。
另外,自Hibernate3发布以来,其产品线愈加成熟,相继出现了Hibernate注释、Hibernate实体管理器、Hibernate插件工具等一系列产品套件。在方便程序员使用Hibernate进行应用程序的开发的同时,也逐渐增强了Hibernate产品线的实力。
本节的以下内容将对Hibernate3的产品套件、核心接口、新特性以及发展趋势进行介绍。
2.2.1 Hibernate3产品套件简介
最新发布的Hibernate3较之Hibernate2有了更加完善的产品体系,包括以下套件,如表2-1所示。
表2-1 Hibernate 3产品套件

1.Hibernate Core for Java
Hibernate Core for Java即平时所说的Hibernate,它可为应用程序提供强大、高性能的对象-关系映射以及查询服务。Hibernate使程序员遵循面向对象的习惯开发持久化类,支持包括关联、继承、多态、聚合等关系。Hibernate使用独特的Hibernate Query Language(HQL)检索方式进行查询,这是在标准SQL语言基础上扩展而来的,也可以使用本地SQL语言,还可以使用更加接近面向对象表述的Query by Criteria(QBC)检索方式或者Query by Example(QBE)检索方式。
程序员采用SQL语言或者JDBC API进行手工编码通常耗时耗力,而Hibernate则能够帮助程序员节省大约95%的时间来进行持久层的编码工作。首先,Hibernate可以为程序员生成SQL语句,减轻了程序员在JDBC结果集以及对象转换等方面的编码工作量,并且使应用程序可以与多种关系型数据库兼容,如Oracle、MSSQLServer、DB2、MySql等。第二,Hibernate所提供的持久化对程序员来讲是完全透明的,一个持久化类仅仅需要具有一个无参的构造函数即可被Hibernate进行持久化。你甚至都不需要持久化类,Hibernate可以直接将集合等对象模型持久化到数据库表中,更有甚者,你可以不把实体或者相关的属性持久化到数据库表中而是映射到SQL表达式中,因此Hibernate提供的映射功能可以说非常灵活。第三,Hibernate提供了周全的查询策略,你可以编写普通的SQL语句、面向对象的HQL语句或者通过Critera接口执行查询,并且Hibernate会采用各种抓取策略和缓存策略在对象载入的过程中对查询进行持续优化。
Hibernate Core for Java的主要特征有:
● 自然编程模型:Hibernate支持更贴近人类思维规律的面向对象习惯,包括继承、多态、聚合、关联等。
● 支持细粒度对象模型:在映射持久化类的同时,Hibernate还可支持如集合类对象以及相关对象等的多种映射。
● 不增加额外代码:在应用程序的构建过程中,Hibernate不会产生额外的代码或字节码。
● 支持查询:Hibernate不仅用于对象持久化,而且可以将数据从数据库中读出并将其转换为持久化对象。
● 支持会话:Hibernate支持长会话,可以控制会话与对象的关联,并可自动为应用程序进行乐观锁定。
● 支持EJB3.0:Hibernate实现了对象持久化管理与对象-关系映射,可以与EJB共同使用。
2.Hibernate Annotations
在过去,Hibernate依靠外部的XML文件来配置持久化对象,数据库映射文件定义在一组XML映射文件里并且在程序开始的时候被装载。有很多办法来创建这些映射文件,或者自动从一个已存在的数据库模式里创建,或者手动从Java类对象中创建。不管那种情况,程序员都得产生一大堆Hibernate映射文件而结束工作。程序员也可以利用外部工具从Javadoc-style的注解中生成映射文件,但这给程序员的开发流程增加了额外的负担。
从Hebernate 3.2开始,Hibernate Annotations提供了JDK 5.0关于对象-关系映射的注释,从而替代或部分替代XML元数据。通过使用Hibernate注释,可以减少XML描述符的使用,在编译期进行校验,以及减少配置和维护工作等。
Hibernate标注包括:
● JPA以及EJB3.0规范中关于对象-关系映射的标准注释。
● Hibernate自定义的扩展注释。
● Hibernate中数据完整性校验(Hibernate Validator API)相关的注释。
● 利用Lucene进行对象模型索引/检索(Hibernate Lucene framework)相关的注释。
Hibernate Annotations运行依托于JDK5.0和Hibernate3.2,但应用服务器或者EJB3.0容器并不是必需的。你可以在任何Java EE 5.0或者Java SE 5.0环境下使用Hibernate Core和Hibernate Annotations。Hibernate Annotations的具体配置过程本书不做讲解,有兴趣的读者可参阅相关资料。
3.Hibernate EntityManager
Hibernate实体管理器在Hibernate Core的强大功能和成熟设计基础上实现了符合JPA规范的Java
持久化提供者(Hibernate Java Persistence Provider)。Hibernate EntityManager可以应用于任何Java EE5应用服务器中或EJB3.0容器中,也可以被使用在Java SE应用中。
Hibernate实体管理器主要实现了以下内容:
● Java持久化管理API标准。
● Java持久化查询语言标准。
● Java持久化对象生命周期规则标准。
● Java持久化配置与打包标准。
4.Hibernate Shards
随着分布式应用环境的逐渐发展,有更多的数据将被存储在一个分布式的体系架构及数据环境中,程序员不可能总将你的关系数据置于一个关系型数据库里。一个分布式应用系统中的多个关系型数据库将给应用部署带来诸多问题(如数据量太大、网络延迟等),Hibernate Shards就是一个被用来对付这些在分布式应用中出现问题的框架,它通过为Hibernate Core增加了“水平分割”的机制从而最大限度地封装和降低了在分布式应用中使用Hibernate的复杂度。简单来说,Hibernate Shards的目标是通过
Hibernate在多重数据库上提供一个统一的视图。
Hibernate Shards的主要特征有:
● 标准的Hibernate编程模型:Hibernate Shards具有与Hibernate完全一致的API,如SessionFactory、 Session、Criteria、Query等,如果程序员已经掌握了Hibernate,那么程序员已经可以使用Hibernate Shards。
● 弹性的共享策略:分布式数据可以以任何方式与程序员的分割“碎片”交叉。
● 支持“虚碎片”:在需要变动分割策略的情况下,Hibernate Shards提供了一种“虚碎片”机制,可以使程序员对目前的“碎片”进行自由的重组,在一定程度上减小了增加新的“碎片”和重新分布数据的难度。
5.Hibernate Validator
注解是一种为域模型指定不变约束的简洁而优雅的方法。例如,你能表示一个属性永远不为null,一个账户余额一定是正的,等等。这些域模型约束通过为bean中的属性添加注解来加以声明。随后一个验证器(validator)会读取并检查这些约束。验证机制可以执行于应用程序中的不同层(表现层或数据访问层),而不必复述任何(前述)这些规则。Hibernate Validator正为这一目的而设计的。
Hibernate Validator工作在两个层次上。第一层,它能检查内存中一个类的示例是否违反约束。第二层,它能将约束应用于Hibernate元模型上,并将它们融入生成的数据库schema中。
每个约束注解(constraint annotation)和一个验证器实现关联,该验证器负责检查位于实体示例上的约束。一个验证器也能(可选地)将约束应用于Hibernate元模型上,让Hibernate生成表示这一约束的DDL。使用合适的事件监听器,程序员能让Hibernate在插入和更新时执行检查操作。Hibernate Validator并不局限于同Hibernate一起使用。程序员能在应用程序的任何地方方便地使用它。
在运行时检查示例时,Hibernate Validator返回违反约束的信息,这些信息以一个InvalidValue数组的形式返回。除了众多其他信息外,InvalidValue包含了一个错误描述消息,该信息可以内嵌与注解相捆绑的参数值(例如长度限制),以及能被提取至ResourceBundle的消息字串。
6.Hibernate Search
Hibernate Search通过透明的配置(Hibernate Annotations)和公共API为持久化域模型和一些可共享的Hibernate经验提供了全文检索的功能。
7.Hibernate Tools
Hibernat Tools主要是为Eclipse和Ant开发的工具,包括:
● Mapping Editor:专为编写Hibernate XML文件设计的编辑器,支持自动完成和语法高亮显示等特性。
● Console:允许用户配置数据库连接、可视化地进行类之间关系的映射、执行HQL查询并浏览结果。
● Reverse Engineering:由数据库模型快速生成域模型中的类、Hibernate映射文件、带有标注的EJB3实体、HTML文档甚至是整个JBoss Seam应用。
● Wizards:一些向导,如生成配置文件。
● Ant task:与Hibernate相关的一个统一的Ant任务。
● Statistics and event viewer:统计和事件查看器。
8.NHibernate
NHibernate是Hibernate的.NET版本,目前发布的版本是1.2,由于超出了本书的讲解范围,因此不做详细介绍。
2.2.2 Hibernate的核心接口
要想正确、灵活地使用Hibernate,程序员首先必须了解Hibernate API。要想了解Hibernate API,程序员首先必须了解在其中定义的几个核心接口。Hibernate的接口大致可以分为以下几种类型:
● 数据库操作接口:指用来完成基本的创建、读取、更新、删除操作以及查询操作的接口。这些接口是Hibernate实现业务逻辑的主要接口,主要有Session、Transaction和Query。
● 配置文件接口:指Hibernate用来读取诸如映射文件这类配置文件的接口,主要有Configuration类。
● 回调接口:它允许应用程序能对一些事件的发生作出相应的操作,主要包括Interceptor、Lifecycle和Validatable。
● 扩展接口:指一些可以用来扩展Hibernate的映射机制的接口,例如UserType、CompositeUserType和IdentifierGenerator等,这些接口可由用户程序来实现。
以下是Hibernate核心接口的介绍。
Session接口
Session类是一个轻量级的类,创建和销毁一个Session对象,不需要消耗太多的时间和空间资源。在实际的应用程序中,有可能会非常频繁地创建和销毁Session对象,这样就对Session提出了较高的要求,如果开销太大,就会产生降低系统性能的后果。同时,Session对象不是线程安全的,因此在实际的应用程序中,最好是一个线程只创建一个Session对象。
程序员可以把Session接口看作介于数据连接与事务管理一种中间接口。程序员可以将Session对象想象成一个持久对象的缓冲区,Hibernate能检测到这些持久对象的改变,并及时将这些改变同步到数据库中。我们有时也称Session是一个持久层管理器,因为它包含这些持久层相关的操作,诸如存储持久对象至数据库,以及从数据库获得它们。请注意:Hibernate的Session不同于JSP应用中的HttpSession。
Session Factory接口
SessionFactory接口是工厂模式的一个实现,SessionFactory的openSession()方法就是从
SessionFactory这个工厂中获取一个新的Session对象。由于SessionFactory是创建Session对象的工厂,因此有必要把它设计成为能够在整个应用程序范围内共享。SessionFactory是重量级的,通常在一个应用程序中,程序员只需要一次性创建SessionFactory的示例,它会“源源不断”地提供Session对象。但是当你的应用程序要操作多个数据库时,那你必须为每个数据库指定一个SessionFactory。
SessionFactory在Hibernate中实际起到了一个缓冲区的作用,它缓冲了Hibernate自动生成的SQL语句和一些其他的映射数据,还缓冲了一些将来有可能重复利用的数据。
Configuration接口
Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的示例首先定位映射文件的位置,读取这些配置,然后创建一个SessionFactory对象。
Transaction接口
Transaction接口用于进行事务管理,它是一个可选的API,程序员可以选择不使用这个接口,取而代之的是Hibernate的设计者自己写的底层事务处理代码。Transaction接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA中的UserTransaction、甚至可以是CORBA事务。之所以这样设计是能让程序员能够使用一个统一事务的操作界面,使自己的项目可以在不同的环境和容器之间方便地移植。
Query和Criteria接口
Query接口让程序员方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
Criteria接口与Query接口非常类似,它允许程序员创建并执行面向对象的标准化查询。值得注意的是Query接口也是轻量级的,它不能在Session之外使用。
Callback接口
当一些有用的事件发生时(例如持久对象的载入、存储、删除时),Callback接口会通知Hibernate去接收一个通知消息。一般而言,Callback接口在用户程序中并不是必需的,但程序员要在自己的项目中创建审计日志时,可能会用到它。
【提示】
对于上述内容,读者可能一时无法明白,用一个简单易懂的说法进行表述:Hibernate启动时,通过Configuration接口获取目前的配置(如数据源、连接用户名及密码、数据库方言以及最大连接数等)并将这些配置加载到内存中,当执行到初始化一个SessionFactory接口时,便一次性创建这个线程安全的Session工厂,每当需要执行持久化操作时,应用程序就会从这个工厂中取一个Session,直至其生命周期结束。在持久化的过程中,可能会用到Transaction接口进行事务处理,也可能会通过Query和Criteria接口进行查询,Hibernate底层会自动实现Callback接口。
2.2.3 Hibernate 3的新特性
从表2-1可以看出,Hibernate 3在产品的应用性上有了极大提高,并且基于Java 1.5进行了改进,且与EJB 3.0进行了集成,在功能上有了很大的提升。同时,Hibernate还对当今另一主流开发平台——微软的.NET平台进行了支持,因此具有更加强大的生命力。有兴趣的读者,可以自己查阅一些NHibernate的资料,本书对此不做介绍。
相对于Hibernate 2,Hibernate 3版本的变化包括三个方面:
1.API的变化
API的变化中比较重大的变化是包名的变化,主要是包的根路径发生了改变,这一点程序员只需要在Eclipse中查看Hibernate3.jar这个文件中所包含的类就知道了:Hibernate 3的根路径从Hibernate2的net.sf.hibernate变成了org.hibernate。由于这两个路径完全不同,所以程序员能够在同一个应用程序中同时使用Hibernate 2和Hibernate 3。如果希望把已有的应用升级到Hibernate 3,那么升级的第一步是把Java源程序中的所有net.sf.hibernate替换为org.hibernate。
另外,在Hibernate 3中,HibernateException异常以及它的所有子类都继承了Java.lang.Runtime Exception。因此在编译时,编译器不会再检查HibernateException。在Hibernate 3中,Session接口的createSQLQuery()方法被废弃,被移到org.hibernate.classic.Session接口中。Hibernate3采用新的SQLQuery接口来完成相同的功能。在UserType和CompositeUserType接口中也都加入了一些新的方法,这两个接口被移到org.hibernate.usertype包中,用户定义的UserType和CompositeUserType实现类必须实现这些新方法。Hibernate 3提供了ParameterizedType接口,用于更好的重用用户自定义的类型。
以上的这些主要变化将会影响到应用程序,程序员必须要进行相应的调整,才能使基于Hibernate3的应用程序正常运行。
2.元数据
元数据主要是指Hibernate映射文件中各种元素和属性的用法的变化。首当其冲的是Hibernate映射文件的文档类型定义,即DTD文件发生了变化,这一点程序员可以从任何一个Hibernate3的映射文件的文件头中发现,即在<DOCTYPE>元素中定义的URL从http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd变成了http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd。
还有一个重大的改变就是lazy属性的默认值从false变成了true,这也是Hibernate从优化应用程序性能的角度出发所做出的决定。因为当lazy=false时,Hibernate对所有字段都采取预先抓取的策略,如果程序员希望采用延迟加载,必须手工在映射文件中将lazy属性的值设为true,然而总是采用预先抓取策略势必会造成极大的资源占用,从而降低应用程序的性能。所以从应用程序的角度来讲,更希望lazy的默认值是true,这样在有需要的时候才去采用预先抓取的检索策略。
3.HQL查询语句
Hibernate3采用新的基于ANTLR的HQL/SQL查询翻译器,不过,Hibernate2的查询翻译器也依然存在。在Hibernate的配置文件中,hibernate.query.factory_class属性用来选择查询翻译器。
2.2.4 Hibernate的发展趋势
Hibernate是一个非常优秀的持久层解决方案,具有以下发展趋势:
● 与其他开发框架的集成将越来越成熟:如与struts、spring、jbpm的集成,充分发挥Hibernate自身的优势,也吸取了对方框架的优势,在软件系统的各个层各司其职。
● 产品线的逐渐完善:通过增加若干的工具套件,并支持.net平台,使Hibernate具有更强大的生命力。
● 与EJB更好地集成:集成EJB,开始将重点转向重量级应用,使得Hibernate在企业级应用中必将占据一席之地。
2.3 其他持久层框架
除了本书将要介绍的Hibernate之外,还有许多常用的持久层框架,现简要介绍如下:
● iBatis。使用iBatis提供的ORM机制。对业务逻辑实现人员而言,面对的是纯粹的Java对象,这一层与通过Hibernate实现ORM而言基本一致,而对于具体的数据操作,Hibernate会自动生成SQL语句,而iBatis则要求程序员编写具体的SQL语句。相对Hibernate等“全自动”ORM机制而言,iBatis以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。作为“全自动”ORM实现的一种有益补充,Ibatis的出现显得更有意义。
● Cayenne。Cayenne是一个面向对象的持久层框架,提供了一系列工具和函数包,可以让开发者进行面向对象的持久层开发,支持提供了类库和GUI图形开发工具来帮助开发者进行O/R Mapping和部署。目前最新版本是Cayenne 3.0M2。
● Apache OJB。ObJectRelationalBridge-OJB是基于XML的对象/关系映射工具。OJB提供的一些高级特性如:对象缓存,延迟加载,利用事务隔离级别的结构进行分布式管理,支持悲观与乐观锁。OJB还提供了一个灵活的配置与插件机制以便可以扩展加入自己的功能。
● Jaxor。 Jaxor是一个简单但功能强大的创建到关系映像层对象的工具。它允许开发者轻松地在表中插入、更新和删除行,但也可被扩展为创建一个可扩展的映像层,这个层可创建一个完全的域模型,并透明地映射到数据库表。
● Top Link。Top Link是原属Web Gain公司的Java对象关系可持续性体系结构,现在已被Oracle
收购,并重新包装为Oracle AS Top Link。TOP Link为在关系数据库表中存储Java对象和企业Java组件(EJB)从而提供高度灵活和高效的机制。Top Link为开发人员提供极佳的性能和选择,可以与任何数据库、应用服务器、开发工具集和过程以及J2EE体系结构协同工作。
● JPOX。JPOX是一个Java Data Objects (JDO) 实现,基于Apache 2.0,并提供了Java对象透明的一致性。JPOX支持多维数据库(OLAP) 和RDBMS数据库,也支持现存的模式。Java数据对象的开源运行环境JPOX 1.1.0已经发布,它向Java对象提供了透明持久性功能,主要支持SQL数据库,可以被JDOQL或者SQL查询。
● Apache Torque。Apache Torque是一个使用关系数据库作为存储手段的Java应用程序持久化工具,是Apache的公开源代码项目。Torque是一个开源项目,由Web应用程序框架Jakarta Apache Turbine发展而来,但现在已完全独立于Turbine。 Torque主要包含两部分:一部分是Generator,它可以产生应用程序需要的所有数据库资源,包括SQL和Java文件;另外一部分是Runtime,提供使用这些代码访问数据库的运行时环境。目前Torque支持的数据库包括DB2、SQL Server、Oracle、PostgreSQL等。
● Hibernate的轻量级ORM模型逐步确立了在Java ORM架构中领导地位,甚至取代复杂而又繁琐的EJB模型而成为事实上的Java ORM工业标准。而且其中的许多设计均被J2EE标准组织吸纳而成为最新EJB 3.0规范的标准。
2.4 小结
中间件的概念十分广泛,Hibernate是一种强大的可提供对象-关系持久化和查询服务的数据库中间件。Hibernate的核心接口有:
● Session接口:提供数据库连接以及一组持久化对象的缓冲区。
● SessionFactory接口:用于产生Session的示例。
● Configuration接口:对Hibernate进行配置,以及对它进行启动。
● Transaction接口:提供事务管理。
随着Hibernate的广泛应用,越来越多的Java中间件厂商和Java项目(如JBoss、JBPM等)开始把目光集中到Hibernate上并将其纳入自身的体系,使Hibernate具有了越来越广阔的发展前景。
2.5 习题
1.请说明Hibernate的Configuration接口的主要功能。
2.请说明Hibernate的Session接口的主要功能。
3.请说明Hibernate的SessionFactory接口的主要功能。
4.您还了解哪些持久化框架?