第5章Hibernate5框架技术入门

Hibernate创造性地使用对象-关系映射(Object-RelationMapping,ORM)模型,将
关系数据转换为对象,简化数据的操作方式。在软件项目开发中,要能够创造性地提出
问题的解决方案。

在JavaWeb项目开发中,有许多功能模块需要连接数据库系统,实现对数据库表的操
作。在Java程序设计和JSP程序设计技术中,使用JDBC(JavaDataBaseConnectivity)技
术连接数据库。为了实现与数据库的高效操作,提高JavaWeb的项目性能,可以使用
Hibernate5框架技术。本章主要介绍Hibernate5的基本内容。

本章主要内容如下
。
(1)Hibernate5的发展与特点
。
(2)Hibernate5软件包的下载与配置
。
(3)Hibernate5的工作原理
。
(4)Hibernate5的核心组件
。


(5)基于Struts2+Hibernate5的登录和注册系统。
5.1 
Hibernate5的基础知识
Hibernate是封装了JDBC的一种开放源代码的对象-关系映射框架,使程序员可以使
用面向对象的思想操作数据库。Hibernate是一种对象-关系映射的解决方案,即将Java对
象与对象之间的关系映射到数据库表与表之间的关系。

Hibernate5 

的基础知5.1 
Hient5的发展与特点

识1.brae

目前,Hibernate是Java工程师招聘中要求必备的一门技能,也是JavaWeb三大经典
框架之一。

2001年,Hibernate1发布,即Hibernate的第一个版本;2003年,Hibernate2发布,并在
当年获得Jolt2003大奖(Jolt大奖素有“软件业界的奥斯卡”的美誉,共设通用类图书、技术
类图书、语言和开发环境、框架库和组件、开发者网站等十余个分类大奖),同年,Hibernate 
被JBos 
公司收购,成为该公司的子项目之一;2005年,JBos 
公司发布Hibernate3;2006 
年,o公司被Rdht公司收购;2012年11月,Hient1.2015年3月,

JBs 
eabrae4.8发布;
Hibrae5.

ent0发布。

Hibernate是封装了JDBC与ORM技术的数据持久性解决方案。在Java世界中, 

Hibernate是众多ORM软件中获得关注最多、使用最广泛的框架。它成功地实现了透明持

久化,以面向对象的HQL语句封装SQL语句,为开发人员提供了一个简单灵活且面向对

象的数据访问接口。Hibernate是一个开源软件,开发人员可以很方便地获得软件源代码。

230

当遇到问题时,程序员可以深入源代码中查看究竟,甚至修改Hibernate内部错误并将修改

方案提供给JBos 
公司,从而帮助Hibernate框架技术改进。

Hibernate自发布以来受到业界的欢迎,目前许多Java程序员学习和使用它来开发商
业应用软件。另外,网络上有大量介绍和讨论Hibernate应用的文章,JBos 
网站也提供了
一个完善的社区,所以一旦在使用中遇到问题,开发者可以轻松地在网络上搜索到相应的解
决方法,这又进一步吸引了更多的程序员来学习Hibernate,吸引更多的公司采用Hibernate 
开发软件。

Hibernate为使用者考虑得十分周全,对于一个普通的程序员来说,只需学习不到10个
类的用法就可以开发基于Hibernate框架的应用系统,实际使用起来十分方便。
Hibernate提供了透明持久化功能,支持第三方框架,即能与其他框架进行整合,如
Struts、Spring等,不但提供面向对象的HQL,而且支持传统的SQL语句。
在基于MVC设计模式的JavaWeb应用中,Hibernate可以作为应用的数据访问层或
持久层。它具有以下特点。

(1)Hibernate是一个开放源代码的对象-关系映射框架,它对JDBC进行了非常轻量级
的对象封装,使得Java工程师可以随心所欲地使用面向对象编程(ObjectOriented 
Programming,OOP)思维来操作数据库。Hibernate可以应用在任何使用JDBC的场合,既
可以在Java的客户端程序使用,也可以在Servlet、JSP的JavaWeb应用中使用,最具革命
意义的是,Hibernate可以在JavaEE框架中取代CMP,完成数据持久化的重任。

(2)Hibernate的目标是成为Java中处理数据持久性问题的一种完整解决方案。它协
调应用程序与关系数据库的交互,把开发者解放出来,专注于项目的业务逻辑问题。

(3)Hibernate是一种非强迫性的解决方案。开发者在写业务逻辑和持久化类时,不会
被要求遵循许多Hibernate特定的规则和设计模式。这样,Hibernate就可以与大多数新的
和现有的应用程序进行集成,而不需要对应用程序的其余部分做破坏性改动。

5.2 
Hient5软件包的下载和配置
1.brae

本书的实例和项目使用的是Hibrae5.12版本,

ent2.2017年10月发布,如需使用
Hibernate其他版本进行Web项目开发,可以在其官方网站下载。

1.软件包下载
由于Hibernate先被JBos 
公司收购,后来JBos 
公司被Redhat公司收购,所以
Hibernate5可以在以下3个网站下载:www.redhatcom 、www.bos.org和www.

jhibernateorg。根据需要在上述3个网站下载自己要使用的(.) Hibernate版本。官方页面之
一如图5-1所(.) 示。

单击图5-1所示页面中的HibernateORM,出现图5-2。

单击图5-2所示页面中的选择点5.出现如图5-在该页面

2后,3所示的版本选择页面, 
的下方单击5.12.nl区域中的Downod按钮进行下载。

2.Fiala
单击图5-3所示页面中Download按钮后,出现图5-4,选择下载路径后进行下载。

2.Hibernate5软件包中主要文件
解压缩hibraerlae5.12.iazp文件后得到一个名为hient-ees

ent-ees-2.Fnlibraerlae

5.12.nl的文件夹,-示。
2.Fia该文件夹结构如图55所(.) 
231

图5-
1 
Hibernate官方页面


图5-
2 
选择下载页面


图5-
3 
版本选择页面

232

图5-
4 
选择下载路径


图5-
5 
Hibernate5文件夹结构

(1)documentation文件夹:存放Hibernate5的相关文档,包括Hibernate5的参考文档和
API 文档等。
(2)lib文件夹:存放Hibernate5框架的核心类库以及Hibernate5的第三方类库。该
文件夹下的required子目录存放运行Hibernate5项目时必需的核心类库。
(3)project文件夹:存放Hibernate5项目的源代码。

3.Hibernate5的配置
Hibernate5的lib文件夹有6个子目录,需要在项目的类库中添加required和jpametamodel-generate子目录下面的所有JAR 文件,其他目录中的JAR 文件可根据项目的
实际需求添加。例如,使用连接池需要添加lib\optional\c3p0下面的JAR 文件和使用缓存
功能需要使用lib\optional\chcache下面的JAR 文件。

由于Neten2和MyElpsbrae,

Bas8.cie2017 中都集成了Hient所以可以使用工具中自
带的Hibernate。集成的Hibernate版本一般不是Hibernate的最新版本。由于Hibernate 
各版本之间存在一些细节差异,有可能在配置文件和映射文件中存在差异导致项目无法运
行。使用本书进行项目开发时建议使用Hibrae5.12 。在Neten2、MyEcis

ent2.Bas8.lpe 
2017 和Eclpe中配置Hiberate与第1章中介绍的配置Stus2.10 的方法相似,这里不

isnrt5.

233

再介绍。

5.1.3Hibernate5的工作原理
Hibernate5的工作原理如图5-6所示。


图5-
6 
Hibernate5的工作原理

Hibernate5的工作原理如下。
首先,Cofgrtobraeient.fxm

niuain读取Hient5的配置文件hbraecg.l和映射文件

*.hbm.xml中的信息,即加载配置文件和映射文件,并通过Hibernate5配置文件生成一个
多线程的SesionFactory对象。然后,多线程SesionFactory对象生成一个线程Sesion对
象。Sesion对象生成Query对象或者Transaction对象。可通过Sesion对象的get()、
load()、save()、update()、delete()和saveOrUpdate()等方法对持久化对象(Persistent 
Objects,PO)进行加载、保存、更新、删除等;也可利用Query对象执行查询操作;如果没有
异常,Transaction对象将提交这些数据到数据库中。
5.brae5的核心组件
2 
Hient

基于Hibernate5框架的项目开发的关键点就是使用Hibernate5的核心类和接口,即核
心组件。Hibernate5的核心组件位于业务层和持久化层之间。Hibernate5除核心组件外
还包括Hibraehbraecxmient.oris)、xx.

ent5配置文件(ient.fg.l或hbraeprpete映射文件(xient5 
hbm.l)和持久化对象。

Hbraexm

的核心组
件1.Configuration 

Configuration负责配置并启动Hibernate5,创建SesionFactory对象。在Hibernate5 
的启动过程中,Configuration类的实例首先定位映射文件位置、读取配置,然后创建
SesionFactory对象。

2.SesionFaty 

SesionFactroy(c) 负(r) 责初始化Hibernate5。它充当数据存储源的代理,并负责创建

234 


Sesion对象,这里用到了工厂模式。需要注意的是,SesionFactory并不是轻量级的,因为
一般情况下,一个项目通常只需要一个SesionFactory即可,当需要多次操作数据库时,可
以为每个数据库指定一个SesionFactory线程对象。SesionFactroy是产生Sesion实例
的工厂。

3.Sesin 

Sesion负(o) 责执行PO的操作,它用get()、load()、save()、update()和delete()等方法来
对PO进行加载、保存、更新及删除等操作。但需要注意的是,Sesion对象是非线程安全
的。同时,Hibernate5的Sesion不同于JSP应用中的HtpSesion。这里使用的Sesion 
术语,其实指的是Hibernate5中的Sesion。

4.Transaction 

Transaction负责事务相关的操作,用来管理Hibernate5事务,它的主要方法有commit()
和rolback(),可以使用Sesion的beginTransaction()方法生成。它是可选的,开发人员也
可以设计编写自己的底层事务处理代码。

5.Qry 

Query(u) 负(e) 责执行各种数据库查询。它可以使用HQL对PO进行查询操作。Query对
象可以使用Sesion的createQuery()方法生成。

6.Hibet5的配置文件
Hibernate5(r) 的(a) 配置文件主要用来配置数据库连接参数,(e) 例如,数据库的驱动程序、URL 、用
户名和密码、数据库方言等。它有两种格式:hbraecg.l和hbraeprpete

ient.fxmient.oris。两
者的配置内容基本相同,但前者比后者使用方便一些,如hibraecg.l可以在其

ent.fxm<maig>子元素中定义用到的映射文件(xx.xml)列表,而使用hbraepoetes时

ppnxhbm.ient.rpri
则需要在程序中以编码方式指明映射文件。一般情况下,hbraecgxmbrae

ient.f.l是Hient5的默
认配置文件。

7.映射文件
映射文件(xxhbm.l)用来把PO与数据库中的表、PO之间的关系与表之间的关系

x.xm
及PO的属性与表字段一一映射起来,它是Hibernate5的核心文件。

8.持久化对象
PO可以是普通的JavaBean,唯一特殊的是它们与Sesion相关联。PO在Hibernate5 
中存在3种状态:临时状态(Transient)、持久化状态(Persistent)和脱管状态(Detached)。
当一个JavaBean对象在内存中孤立存在,不与数据库中的数据有任何关联关系时,那么这
个JavaBean对象就称为临时对象(TransientObject);当它与一个Sesion相关联时,就变
成持久化对象;在Sesion被关闭的同时,对象也会脱离持久化状态,变成脱管对象
(DetachedObject),这时可以被应用程序的任何层自由使用,例如,可用作与表示层(V)打
交道的数据传输对象。

5.基于Srt2和Hient5的登录和注册系统
3 
tusbrae


基于Struts2 
trt5.benat2.和Hibernate5
下面使用Sus2.10和Hire5.12开发一个实现登录和注册功能的项目,该的登录和注

项目的文件结构如图5-tus2.10 、Hient2.册系统

7所示。将项目中使用到的Srt5.brae5.12以及

235

MySQL的JDBC驱动JAR文件添加到项目ch05的“库”中,如图5-8所示。


图5-
7 
项目的文件结构图5-
8 
项目所需的JAR 
文件

1.项目介绍
本项目实现用户登录和用户注册功能。有一个登录页面(gn.sp),代码如例51所

loij
示;登录页面对应的业务控制器为LoginAction类,该Action中覆盖了validate()方法,使
用手工验证对登录页面进行验证,该业务控制器类代码如例5-4所示;如果输入的用户名和
密码都正确,进入登录成功页面(sus.sp),代码如例5-2所示;如果用户没有注册需先注

cej
册,注册页面(register.jsp)代码如例5-3所示;注册页面对应的业务控制器为
RegisterAction类,代码如例5-5所示,注册成功后返回登录页面。此外,还需要配置web. 
xml,代码如例1-3所示;在strutsxml中配置Action,代码如例5-6所示。

该项目使用MySQL数据库。数(.) 据库名为test,有一张名为info的表,表的字段名称、
类型以及长度如图5-9所示。
在基于Struts2+Hibernate5的项目开发中,连接数据库时需要Hibernate5的配置文
件hibraecg.l或者hient.rpris,本项目使用的是hbraecg.l,代码如

ent.fxmbraepoeteient.fxm
例5-7所示,配置文件主要用于加载数据库的驱动以及与数据库建立连接等,该配置文件一
般与strt.l文件放在同一位置,参考图5-7。该配置文件在项目运行时需要加载,本项

usxm

目编写一个加载该配置文件的类HibernateSesionFactory,该类封装了配置文件的加载方

法,即加载配置文件的JavaBean,代码如例5-8所示。

另外,在使用Hibernate5时,项目所用数据库中的每张表都对应一个PO 。通过PO把

236

图5-
9 
数据库info表的结构

页面中的数据保存起来并把数据存到数据库中。为了简化开发,本项目的登录页面和注册
页面都使用同一张表,登录页面和注册页面中的数据都保存在UserInfoPO 中,代码如例5-9 

rnhbm.-映

所示。每个PO 一般都会对应一个映射文件UseIfoPO.xml,代码如例510 所示, 
射文件配置PO 与数据库中表之间的映射关系;映射文件一般都放在和其对应的PO 所在
包中。为了封装登录和注册功能对数据的操作,即登录和注册页面要实现的业务逻辑,本项
目编写一个名为LoginRegisterInfo的JavaBean,该类提供了登录和注册业务处理,可以实
现登录和注册的持久化业务操作,代码如例5-11 所示。

以上文件所在的路径可参考项目文件结构图5-7。

2. 
在web.l中配置核心控制器StusrprAdEeueitr
xmrtPeaenxctFle

参考1.1节中的例13。

3.

3. 
编写视图组件(JSP 
页面) 
登录页面(gn.p)运行效果如图510 所示,代码如例5-1所示。

loijs


图5-10 
登录页面

loijsp)。

gn.

237 

【例51】登录页面(

2 38 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@taglib prefix="s" uri="/struts-tags"%> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title><s:text name="基于SH 的应用"></s:text></title> 
</head> 
<body bgcolor="#CCCCFF"> 
<s:form action="login" method="post"> 
<br><br><br><br><br><br> 
<table border="1" align="center" bgcolor="#AABBCCDD"> 
<tr> 
<td> 
<s:textfield name="userName" label="用户名字" 
size="16"/> 
</td> 
</tr> 
<tr> 
<td> 
<s:password name="password" label="用户密码" 
size="16"/> 
</td> 
</tr> 
<tr> 
<td colspan="2" align="center"> 
<s:submit value="登录"/> 
</td> 
</tr> 
<tr> 
<td colspan="2" align="center"> 
< s:a href="http://localhost:8084/ch05/register.jsp"> 
注册
</s:a> 
</td> 
</tr> 
</table> 
</s:form> 
</body> 
</html> 
登录成功页面(success.jsp),代码如例5-2所示。
【例5-2】 登录成功页面(success.jsp)。 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@taglib prefix="s" uri="/struts-tags"%> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title><s:text name="基于SH 的应用"></s:text></title> 
</head> 
<body bgcolor="#CCCCFF"> 
<hr> 
<table border="0" align="center" bgcolor="#AABBCCDD"> 
<tr>

2 39 
<td> 
欢迎${userName},登录成功! 
</td> 
</tr> 
</table> 
<hr> 
</body> 
</html> 
注册页面(register.jsp)如图5-11所示,代码如例5-3所示。
图5-11 注册页面
【例5-3】 注册页面(register.jsp)。 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@taglib prefix="s" uri="/struts-tags"%> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title><s:text name="基于SH 的应用"></s:text></title> 
</head> 
<body bgcolor="#CCCCFF"> 
<s:form action="register" method="post"> 
<br><br><br><br><br><br> 
<table border="1" align="center" bgcolor="#AABBCCDD"> 
<tr> 
<td> 
<s:textfield name="userName" label="用户名字" 
size="16"/> 
</td> 
</tr> 
<tr> 
<td> 
<s:password name="password1" label="用户密码" 
size="18"/> 
</td> 
</tr> 
<tr> 
<td>