<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>第 5 章 对象/关系数据库映射基础(Basic O/R Mapping)</title><link rel="stylesheet" href="../shared/css/html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.65.1"><link rel="home" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="up" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="previous" href="persistent-classes.html" title="第 4 章 持久化类(Persistent Classes)"><link rel="next" href="collections.html" title="第 6 章 集合类(Collections)映射"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">第 5 章 对象/关系数据库映射基础(Basic O/R Mapping)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="persistent-classes.html">上一页</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="collections.html">下一页</a></td></tr></table><hr></div><div class="chapter" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title"><a name="mapping"></a>第 5 章 对象/关系数据库映射基础(Basic O/R Mapping)</h2></div></div><div></div></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="mapping-declaration"></a>5.1. 映射定义(Mapping declaration)</h2></div></div><div></div></div><p>
对象和关系数据库之间的映射通常是用一个XML文档(XML document)来定义的。这个映射文档被设计为易读的,
并且可以手工修改。映射语言是以Java为中心,这意味着映射文档是按照持久化类的定义来创建的,
而非表的定义。
</p><p>
请注意,虽然很多Hibernate用户选择手写XML映射文档,但也有一些工具可以用来生成映射文档,
包括XDoclet,Middlegen和AndroMDA。
</p><p>
让我们从一个映射的例子开始:
</p><a name="mapping-declaration-ex1"></a><pre class="programlisting"><?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 package="eg">
<class name="Cat"
table="cats"
discriminator-value="C">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="subclass"
type="character"/>
<property name="weight"/>
<property name="birthdate"
type="date"
not-null="true"
update="false"/>
<property name="color"
type="eg.types.ColorUserType"
not-null="true"
update="false"/>
<property name="sex"
not-null="true"
update="false"/>
<property name="litterId"
column="litterId"
update="false"/>
<many-to-one name="mother"
column="mother_id"
update="false"/>
<set name="kittens"
inverse="true"
order-by="litter_id">
<key column="mother_id"/>
<one-to-many class="Cat"/>
</set>
<subclass name="DomesticCat"
discriminator-value="D">
<property name="name"
type="string"/>
</subclass>
</class>
<class name="Dog">
<!-- mapping for Dog could go here -->
</class>
</hibernate-mapping></pre><p>
我们现在开始讨论映射文档的内容。我们只描述Hibernate在运行时用到的文档元素和属性。
映射文档还包括一些额外的可选属性和元素,它们在使用schema导出工具的时候会影响导出的数据库schema结果。
(比如,<tt class="literal"> not-null</tt> 属性。)
</p><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="mapping-declaration-doctype"></a>5.1.1. Doctype</h3></div></div><div></div></div><p>
所有的XML映射都需要定义如上所示的doctype。DTD可以从上述URL中获取,
也可以从<tt class="literal">hibernate-x.x.x/src/net/sf/hibernate</tt>目录中、
或<tt class="literal">hibernate.jar</tt>文件中找到。Hibernate总是会首先在它的classptah中搜索DTD文件。
如果你发现它是通过连接Internet查找DTD文件,就对照你的classpath目录检查XML文件里的DTD声明。
</p><div class="sect3" lang="zh-cn"><div class="titlepage"><div><div><h4 class="title"><a name="mapping-declaration-entity-resolution"></a>5.1.1.1. EntityResolver</h4></div></div><div></div></div><p>
As mentioned previously, Hibernate will first attempt to resolve DTDs in its classpath. The
manner in which it does this is by registering a custom <tt class="literal">org.xml.sax.EntityResolver</tt>
implementation with the SAXReader it uses to read in t