返回介绍

编写映射文档

发布于 2025-04-21 21:42:11 字数 4389 浏览 0 评论 0 收藏

传统的 Hibernate 使用 XML 文档来维护 Java 类和关系数据库表之间的映射关系。这种映射文档设计为可由开发人员阅读和手工编辑的。你也可以用图形化的 CASE(Computer Aided Software Engineering,计算机辅助软件工程)工具(例如 Togethor( [1] )、Rose( [2] )以及 Poseidon( [3] ))来建立表示数据模型的 UML 图表,再将这些图表输入到 AndroMDA( [4] )(http://www.andromda.org/)中,就可以生成相应的 Hibernate 映射文档。前面提到的 Hibernate Tools 包也可以为你提供这些功能(第 11 章将会演示在 Eclipse 中使用它们是多么容易)。

要牢记,Hibernate 及其扩展工具可以让你用其他方式进行开发。如果你已经有了 Java 类或数据,也可以从它们开始着手。我们还会学习一种更新的方法—Hibernate 标注,它可以让你完全脱离开 XML 映射文档,这种方法将在第 7 章加以介绍。

这里,我们先手工编写 XML 映射文档,这是一种相当实用的方法。我们要为曲目(Track)对象创建映射文件。曲目就是各个可以单独欣赏的乐曲,或是可以收录在乐曲集或演奏列表中的乐曲。首先,我们要记录曲目的标题、存储实际音乐的文件路径、它的播放时间、曲目添加进数据库的日期以及播放曲目应该用的音量(不同乐曲在录制时采用的音量不见得相同,总用预设的默认音量播放不一定合适)。

为什么选择这个示例

你可能根本不需要创建一个新的系统来保存音乐曲目,但在建立这个示例的映射文档时所涉及的概念和处理过程,可以在你的实际项目中加以应用。

应该怎么做

注意:你可能会觉得这一映射文件中包含了太多的信息。正如你所看到的,确实如此,可以用它来创建很多有用的项目资源。

打开你喜欢用的文本编辑器,在前面 1.7 节中创建的 src/com/oreilly/hh/data 目录下创建一个名为 Track.hbm.xml 的文件(如果你跳过了这一节,就得回去再阅读一下 1.7 节,因为本示例要依赖当时所建立的项目目录结构和工具)。在该映射文档中输入例 2-1 所示的内容。

例 2-1:曲目对象的映射文档:Track.hbm.xml

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">❶

<hibernate-mapping>

<class name="com.oreilly.hh.data.Track"table="TRACK">❷

<meta attribute="class-description">❸

Represents a single playable track in the music database.

@author Jim Elliott(with help from Hibernate)

</meta>

<id name="id"type="int"column="TRACK_ID">❹

<meta attribute="scope-set">protected</meta>

<generator class="native"/>❺

</id>

<property name="title"type="string"not-null="true"/>❻

<property name="filePath"type="string"not-null="true"/>

<property name="playTime"type="time">❼

<meta attribute="field-description">Playing time</meta>

</property>

<property name="added"type="date">

<meta attribute="field-description">When the track was created</meta>

</property>

<property name="volume"type="short"not-null="true">

<meta attribute="field-description">How loud to play the track</meta>

</property>

</class>

</hibernate-mapping>

❶最前面的 3 行是有效的 XML 文档所必需的预定义部分,用于声明该 XML 文档符合 Hibernate 映射使用的文档类型定义。实际的映射内容将位于 hibernate-mapping 标签内部。

❷我们正在为一个类(com.oreilly.hh.data.Track)定义它的映射,这个类的名称和包名与已经创建的文件的名称和路径是一致的。但这种关系不是必需的,可以在一个映射文档中为任意数量的类定义它们的映射,为映射文件起任意名字,并把它放在任何地方,只要告诉 Hibernate 怎么找到这个文件就可以了。不过,根据映射到的类来命名映射文件,并将它和映射到的类放在一起,这一惯例带来的好处是:当需要使用这个类时,Hibernate 能够自动定位该映射文档。当类的数量不多时,这样可以简化 Hibernate 的配置和使用。

如果映射类的数量比较多,那么你可能会希望使用 XML 格式的 Hibernate 配置文件,再从这个配置文件中引用所有的映射文档,而不必像本书第 1 版那样,在所有示例源代码中再涉及它们(从下一章开始,就会看到我们换用了这种新方法)。此外,在使用基于 XML 的配置文件时,将各个映射文档和 Hibernate 配置文件放在一起,而不是和映射类分散地保存,这样做更有意义。

在 class 元素的开始标签中,我们指定这个类要保存在一个名为 TRACK 的数据库表中。

❸meta 标签并不会直接影响映射,相反,这个标签为使用其他不同工具而提供额外的信息。在这个例子中,通过将 attribute 属性值指定为"class-description",我们告诉 Java 代码生成工具:需要为 Track 类关联什么样的 JavaDoc 文本信息。这个标签完全是可选的,在本章稍后的“生成 Java 类”一节中,就会看到包含 JavaDoc 信息的结果。

❹映射内容的其他部分用于设定我们想保存到数据库中的信息,也就是类的属性以及数据库表中与之相关的字段。虽然我们在介绍这个例子时没有提及,但每个曲目对象都需要一个 id 属性。按照数据库的最佳实践标准,我们应该用一个没有意义的代理键(surrogate key,一个没有语义含义的值,只用来标识特定的数据行)。在 Hibernate 中,key/id(键/属性)之间的映射关系是用 id 标签来设置的。我们准备使用一个 int 类型的值把 id 保存在数据库字段 Track_id 中。这里又包含了一个 meta 标签,用于和 Java 代码生成器进行通信,告诉它这个 id 属性的 set 方法应该具有 protected 类型的访问权限,因为应用程序代码本身没有必要去修改曲目对象的 ID。

❺generator 标签用于设置 Hibernate 如何为新的实例创建其 id 值(注意,该标签与普通的对象/关系映射操作有关,而与 Java 代码生成器无关,而且也不经常使用代码生成器;generator 要比可选的 meta 标签发挥更多的功能)。在这个标签中可以从中选择很多不同的 ID 生成策略,甚至可以编写自己的策略。在这个例子中,我们告诉 Hibernate 使用底层数据库最自然的主键生成方法(稍后我们会看到 Hibernate 如何知道我们正在使用什么数据库)。在 HSQLDB 中,会采用一个标识(identity)字段。

❻在 ID 之后,我们只列举出关心的各种曲目属性。title 是一个字符串属性,而且不能为 null。filePath 也有同样的属性设置,而除了 volume 以外,其他属性都可以为 null。

❼playTime 是 time 类型,added 是 date 类型,而 volume 是 short 类型。最后三个属性用了另一个新的 meta 属性"field-description",用它为单个属性指定 JavaDoc 文本信息,但目前的代码生成器对此还有些限制。

该映射文件严格而简练地指定了我们需要表达的音乐曲目的各种数据,而且 Hibernate 也可以处理这种映射格式。接下来我们就看看 Hibernate 实际上是如何处理的(Hibernate 能够表示更为复杂的信息,包括表示对象之间的关系,我们将在接下来的几章中加以介绍。附录 E 也讨论了一些与深入学习本书内容相关的方法)。

[1] http://www.borland.com/us/products/together/index.html. [2] http://www-306.ibm.com/software/awdtools/developer/thechnical/. [3] http://genteware.com/index.php. [4] http://www.andromda.org/.

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。