
Hibernate In Action
中文版
Java 爱好者 http://www.JavaFan.NET 制作
第一章 理解对象-关系持续性
我们工作的每个软件项目工程中,管理持续性数据的方法已经成为一项关键的设计决定。
对于Java应用,持续性数据并不是一个新的或不寻常的需求,你也许曾经期望能够在许多相
似的,已被很好构建的持续性解决方案中简单地进行选择。考虑一下Web应用框架(Jakarta
Struts 对 WebWork),GUI组件框架(Swing 对 SWT),或模版工具(JSP 对 Velocity)。每
一种相互竞争的解决方案都有其优缺点,但它们至少都共享了相同的范围与总体的方法。不
幸的是,这还不是持续性技术的情形,对持续性技术相同的问题有许多不同的混乱的解决方
案。
在过去的几年里,持续性已经成为Java社区里一个争论的热点话题。对这个问题的范围
许多开发者的意见甚至还不一致。持续性还是一个问题吗?它早已被关系技术与其扩展例如
存储过程解决了。或者它是一个更一般的问题,必须使用特殊的Java组件模型例如EJB实体
Bean来处理?甚至SQL和JDBC中最基本的CRUD(create, read, update, delete)操作也需要
进行手工编码,还是让这些工作自动化?如果每一种数据库管理系统都有它自己的方言,我
们如何达到可移植性?我们应该完全放弃SQL并采用一种新的数据库技术,例如面向对象数据
库系统吗?争论仍在继续,但是最近一种称作对象-关系映射(ORM)的解决方案逐渐地被接
受。Hibernate就是这样一种开源的ORM实现。
Hibernate是一个雄心勃勃的项目,它的目标是成为Java中管理持续性数据问题的一种完
整的解决方案。它协调应用与关系数据库的交互,让开发者解放出来专注于手中的业务问题。
Hibernate是一种非强迫性的解决方案。我们的意思是指在写业务逻辑与持续性类时,你不会
被要求遵循许多Hibernate特定的规则和设计模式。这样,Hibernate就可以与大多数新的和
现有的应用平稳地集成,而不需要对应用的其余部分作破坏性的改动。

Hibernate In Action
中文版
Java 爱好者 http://www.JavaFan.NET 制作
本书是关于Hibernate的。我们包含了基本与高级的特征,并 且描述了许多使用Hibernate
开发新应用时的推荐方式。通常这些推荐并不特定于Hibernate——有时它们可能是我们关于
使用持续性数据工作时处理事情的最佳方式的一些想法,只不过在Hibernate的环境中进行了
介绍。然而,在我们可以开始使用Hibernate之前,你需要理解对象持续性和对象-关系映射
的核心问题。本章解释了为什么像Hibernate这样的工具是必需的。
首先,我们定义了在面向对象的应用环境中持续性数据的管理,并且讨论了SQL,JDBC和
Java的关系,Hibernate就是在这些基础的技术与标准之上构建的。然后我们讨论了所谓的对
象-关系范例不匹配的问题和使用关系数据库进行面向对象的软件开发中所遇到的一些一般
性的问题。随着这个问题列表的增长,我们需要一些工具与模式来最小化我们用在与持续性
有关的代码上的时间就变得很明显了。在我们查看了可选的工具和持续性机制后,你会发现
ORM在许多情况下可能是最好的解决方案。我们关于ORM的优缺点的讨论给了你一个完整的背
景,在你为自己的项目选择持续性解决方案时可以作出最好的决定。
最好的学习方式并不必须是线性的。我们猜想你可能想立刻尝试一下Hibernate。如果这
的确是你喜欢的方式,请跳到第2章第2.1节“开始”,在那儿我们进入并开始编写一个(小
的)Hibernate应用。不读这一章你也可能理解第2章,但我们还是推荐你在循环通读本书的
某一时刻再回到这一章。那样,你就可以准备好并且具有了学习其余资料所需的所有的背景
概念。
1.1 什么是持续性?
几乎所有的应用都需要持续性数据。持续性在应用开发中是一个基本的概念。如果当主
机停电时一个信息系统没有保存用户输入的数据,这样的系统几乎没有实际的用途。当我们
讨论Java中的持续性时,我们通常是指使用SQL存储在关系数据库中的数据。我们从简单地查

Hibernate In Action
中文版
Java 爱好者 http://www.JavaFan.NET 制作
看一下这项技术和我们如何在Java中使用它开始。具有了这些知识之后,我们继续关于持续
性的讨论以及如何在面向对象的应用中实现它。
1.1.1 关系数据库
你,像许多其他的开发者,很可能在使用一个关系数据库进行工作。实际上,我们中的
大多数每天都在使用关系数据库。关系技术是一个已知数。仅此一点就是许多组织选择它的
一个充分的理由。但仅仅这样说就有点欠考虑了。关系数据库如此不易改变不是因为偶然的
原因而是因为它们那令人难以置信的灵活与健壮的数据管理方法。
关系数据库管理系统既不特定于Java,也不特定于特殊的应用。关系技术提供了一种在
不同的应用或者相同应用的不同技术(例如事务工具与报表工具)之间共享数据的方式。关
系技术是多种不同的系统与技术平台之间的一个共同特征。因此,关系数据模型通常是业务
实体共同的企业级表示。
关系数据库管理系统具有基于SQL的应用编程接口,因此我们称今天的关系数据库产品为
SQL数据库管理系统,或者当我们讨论特定系统时,称之为SQL数据库。
1.1.2 理解SQL
为了有效地使用Hibernate,对关系模型和SQL扎实的理解是前提条件。你需要用你的SQL
知识来调节你的Hibernate应用的性能。Hibernate会自动化许多重复的编码任务,如果你想
利用现代SQL数据库的全部能力,你的持续性技术的知识必须扩充至超过Hibernate本身。记住
基本目标是健壮地有效地管理持续性数据。
让我们回顾一些本书中用到的SQL术语。你使用SQL作为数据定义语言(DDL)通过CREATE
与ALTER命令来创建数据库模式。创建了表(索引,序列等等)之后,你又将SQL作为数据处

Hibernate In Action
中文版
Java 爱好者 http://www.JavaFan.NET 制作
理语言(DML)来使用。使用DML,你执行SQL操作来处理与取出数据。处理操作包括插入,更
新和删除。你使用约束,投射,和连接操作(包括笛卡尔积)执行查询来取出数据。为了有
效地生成报表,你以任意的方式使用SQL来分组,排序和合计数据。你甚至可以相互嵌套SQL
命令,这项技术被称作子查询。你也许已经使用了多年的SQL并且非常熟悉用它编写的基本操
作和命令。尽管如此,我们的经验还是告诉我们SQL有时难于记忆并且有些术语有不同的用法。
为了理解本书,我们不得不使用相同的术语与概念;因此,如果我们提到的任何术语是新出
现的或者是不清楚的,我们建议你看一下附录A。
为了进行健全的Java数据库应用开发,SQL知识是强制的。如果你需要更多的资料,找一
本Dan Tow的优秀著作《SQL Tuning》。同时读一下《An Introduction to Database Systems》,
学习一些(关系)数据库系统的理论,概念和思想。关系数据库是ORM的一部分,当然另一部
分由你的Java应用中的对象构成,它们需要使用SQL被持续化到数据库中。
1.1.3 在Java中使用SQL
当你在Java应用中使用SQL工作时,Java代码通过Java数据库连接(JDBC)执行SQL命令
来操作数据库。SQL可能被手工编码并嵌入到Java代码中,或者可能被匆忙地通过Java代码生
成。你使用JDBC API将变量绑定到查询参数上,开始执行查询,在查询结果表上滚动,从结
果集中取出值,等等。这些都是底层的数据访问任务,作为应用开发者,我们对需要这些数
据访问的业务问题更加感兴趣。需要我们自己来关心这些单调的机械的细节,好像并不是确
定无疑的。
我们真正想做的是能够编写保存和取出复杂对象(我们的类实例)的代码—从数据库中
取出或者保存到数据库中,尽量为我们减少这些底层的苦差事。
因为这些数据访问任务通常都是非常单调的,我们不禁要问:关系数据模型特别是SQL是