Hibernate 开发指南
Original Author: 夏昕<xiaxin@gmail.com>
本文是由笔者 2003 年底一个咨询项目中,为客户做的持久层设计培训
文案整理而来。
其中的内容涉及 Hibernate 的使用,以及一部分笔者实际咨询项目中的
经验积累,另一方面,大部分是笔者在 Hibernate 的官方论坛中与众多
技术专家交流所得。
既来于斯,则归于斯。希望能聊有所用。
本文并非试图替代 Hibernate Reference,相对而言,Hibernate Reference
的编写目的是为开发者提供更简便的条目索引,而本文目标则在于为开
发人员提供一个入门和掌握 Hibernate 的途径。
本文需结合 Hibernate Reference 使用。
笔者好友曹晓钢义务组织了 Hibernate 文档的汉化工作,在此对其辛勤劳作致敬。
中文版 Hibernate Reference 将被包含在 Hibernate 下个官方 Release 中,目前可
通过 http://www.redsaga.com 获取中文版 Hibernate Reference 的最新版本。
本文中如果发现问题和错误,请随时联系笔者,以免误导他人。
本文转载不限,不过请保持本文完整。万分感谢!
Hibernate 开发指南 .......................................................................................................1
准备工作 ..........................................................................................................3
构建 Hibernate 基础代码 ...............................................................................3
由数据库产生基础代码...........................................................................4
Hibernate 配置 ..............................................................................................15
第一段代码 ....................................................................................................17
Hibernate 基础语义 ......................................................................................19
Configuration ........................................................................................19
SessionFactory.......................................................................................20
Session....................................................................................................20
Hibernate 高级特性 ......................................................................................................22
XDoclet 与 Hibernate 映射...........................................................................22
数据检索 ........................................................................................................31
Criteria Query...............................................................................31
Criteria 查询表达式 ................................................................31
Criteria 高级特性 ....................................................................33
限定返回的记录范围.............................................................33
对查询结果进行排序.............................................................33
Hibernate Query Language (HQL).........................................34
数据关联 ........................................................................................................35
一对一关联.............................................................................35
一对多关联.............................................................................37
Ø 单向一对多关系......................................................37
Ø 双向一对多关系......................................................42
多对多关联.............................................................................47
数据访问 ........................................................................................................54
PO 和 VO ...............................................................................................54
关于 unsaved-value ...............................................................................57
Inverse 和 Cascade .........................................................................59
延迟加载(Lazy Loading)............................................................59
事务管理 ........................................................................................................63
基于 JDBC 的事务管理:.....................................................................64
基于 JTA 的事务管理: .......................................................................65
锁(locking).........................................................................................68
悲观锁(Pessimistic Locking) .......................................68
乐观锁(Optimistic Locking)..........................................69
Hibernate 分页 ..........................................................................................73
Cache 管理....................................................................................................75
Session 管理...............................................................................................79
编后赘言 ................................................................................................................84
Hibernate Quick Start
准备工作
1. 下载 Ant 软件包,解压缩(如 C:\ant\)。并将其 bin 目录(如 c:\ant\bin)添加到系统
PATH 中。
2. 下载 Hibernate、Hibernate-Extension 和 Middlegen-Hibernate 软件包的最新版本。
http://prdownloads.sourceforge.net/hibernate/
构建 Hibernate 基础代码
Hibernate 基础代码包括:
1. POJO
POJO 在 Hibernate 语义中理解为数据库表所对应的 Domain Object。这里的 POJO
就是所谓的“Plain Ordinary Java Object”,字面上来讲就是无格式普通 Java 对象,简
单的可以理解为一个不包含逻辑代码的值对象(Value Object 简称 VO)。
一个典型的 POJO:
public class TUser implements Serializable {
private String name;
public User(String name) {
this.name = name;
}
/** default constructor */
public User() {
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
2. Hibernate 映射文件
Hibernate 从本质上来讲是一种“对象-关系型数据映射”( O bject Relational
Mapping 简称 ORM)。前面的 POJO 在这里体现的就是 ORM 中 Object 层的语义,
而映射(Mapping)文件则是将对象(Object)与关系型数据(Relational)相关联
的纽带,在 Hibernate 中,映射文件通常以“.hbm.xml”作为后缀。
构建 Hibernate 基础代码通常有以下途径:
1. 手工编写
2. 直接从数据库中导出表结构,并生成对应的 ORM 文件和 Java 代码。
这是实际开发中最常用的方式,也是这里所推荐的方式。
通过直接从目标数据库中导出数据结构,最小化了手工编码和调整的可能性,从而
最大程度上保证了 ORM 文件和 Java 代码与实际数据库结构相一致。
3. 根据现有的 Java 代码生成对应的映射文件,将 Java 代码与数据库表相绑定。
通过预先编写好的 POJO 生成映射文件,这种方式在实际开发中也经常使用,特别
是结合了 xdoclet 之后显得尤为灵活,其潜在问题就是与实际数据库结构之间可能
出现的同步上的障碍,由于需要手工调整代码,往往调整的过程中由于手工操作的
疏漏,导致最后生成的配置文件错误,这点需要在开发中特别注意。
结合 xdoclet,由 POJO 生成映射文件的技术我们将在“高级特性”章节中进行探讨。
由数据库产生基础代码
通过 Hibernate 官方提供的 MiddleGen for Hibernate 和 Hibernate_Extension 工具包,我
们可以很方便的根据现有数据库,导出数据库表结构,生成 ORM 和 POJO。
1) 首先,将 Middlegen-Hibernate 软件包解压缩( 如解压缩到 C:\Middlegen\ )。
2) 配置目标数据库参数
进入 MiddleGen 目录下的\config\database 子目录,根据我们实际采用的数据库打开
对应的配置文件。如这里我们用的是 mysql 数据库,对应的就是 mysql.xml 文件。
<property name="database.script.file"
value="${src.dir}/sql/${name}-mysql.sql"/>
<property name="database.driver.file"
value="${lib.dir}/mysql.jar"/>
<property name="database.driver.classpath"
value="${database.driver.file}"/>
<property name="database.driver"
value="org.gjt.mm.mysql.Driver"/>
<property name="database.url"
value="jdbc:mysql://localhost/sample"/>
<property name="database.userid"
value="user"/>
<property name="database.password"
value="mypass"/>
<property name="database.schema"
value=""/>
<property name="database.catalog"
value=""/>
<property name="jboss.datasource.mapping"
value="mySQL"/>
其中下划线标准的部分是我们进行配置的内容,分别是数据 url 以及数据库用
户名和密码。
3) 修改 Build.xml
修改 MiddleGen 根目录下的 build.xml 文件,此文件是 Middlegen-Hibernate 的 Ant
构建配置。Middlegen-Hibernate 将根据 build.xml 文件中的具体参数生成数据库表映射
文件。可配置的项目包括:
a) 目标数据库配置文件地址
查找关键字 ”!ENTITY”,得到:
<!DOCTYPE project [
<!ENTITY database SYSTEM
"file:./config/database/hsqldb.xml">
]>
默认情况下,MiddleGen 采用的是 hsqldb.xml,将其修改为我们所用的数据
库配置文件(mysql.xml):
<!DOCTYPE project [
<!ENTITY database SYSTEM
"file:./config/database/mysql.xml">
]>
b) Application name
查找:
<property name="name" value="airline"/>