📄 mapping.html
字号:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>第 5 章 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 章 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 章 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><pre class="programlisting"><?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"><hibernate-mapping package="eg"> <class name="Cat" table="CATS" discriminator-value="C"> <id name="id" column="uid" type="long"> <generator class="hilo"/> </id> <discriminator column="subclass" type="character"/> <property name="birthdate" type="date"/> <property name="color" not-null="true"/> <property name="sex" not-null="true" update="false"/> <property name="weight"/> <many-to-one name="mate" column="mate_id"/> <set name="kittens"> <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文件。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="mapping-declaration-mapping"></a>5.1.2. hibernate-mapping</h3></div></div><div></div></div><p> 这个元素包括三个可选的属性。<tt class="literal">schema</tt>属性,指明了这个映射所引用的表所在的schema名称。假若指定了这个属性,表名会加上所指定的schema的名字扩展为全限定名。假若没有指定,表名就不会使用全限定名。<tt class="literal">default-cascade</tt>指定了未明确注明<tt class="literal">cascade</tt>属性的Java属性和集合类Java会采取什么样的默认级联风格。<tt class="literal">auto-import</tt>属性默认让我们在查询语言中可以使用非全限定名的类名。 </p><div class="programlistingco"><pre class="programlisting"><hibernate-mapping schema="schemaName" <span class="co">(1)</span> default-cascade="none|save-update" <span class="co">(2)</span> auto-import="true|false" <span class="co">(3)</span> package="package.name" <span class="co">(4)</span> /></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left">(1)</td><td valign="top" align="left"><p> <tt class="literal">schema</tt> (可选): 数据库schema名称。 </p></td></tr><tr><td width="5%" valign="top" align="left">(2)</td><td valign="top" align="left"><p> <tt class="literal">default-cascade</tt> (可选 - 默认为 <tt class="literal">none</tt>): 默认的级联风格。 </p></td></tr><tr><td width="5%" valign="top" align="left">(3)</td><td valign="top" align="left"><p> <tt class="literal">auto-import</tt> (可选 - 默认为 <tt class="literal">true</tt>): 指定是否我们可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。 </p><tr><td width="5%" valign="top" align="left">(4)</td><td valign="top" align="left"><p> <tt class="literal">package</tt> (可选): 指定一个包前缀,如果在映射文档中没有指定全限定名,就使用这个包名。 </p></td></tr></td></tr></table></div></div><p> 假若你有两个持久化类,它们的非全限定名是一样的(就是在不同的包里面--译者注),你应该设置<tt class="literal">auto-import="false"</tt>。假若说你把一个“import过”的名字同时对应两个类, Hibernate会抛出一个异常。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="mapping-declaration-class"></a>5.1.3. class</h3></div></div><div></div></div><p> 你可以使用<tt class="literal">class</tt>元素来定义一个持久化类: </p><div class="programlistingco"><pre class="programlisting"><class name="ClassName" <span class="co">(1)</span> table="tableName" <span class="co">(2)</span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -