?? inheritance.html
字號(hào):
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>第 10 章 继承映射(Inheritance Mappings)</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="components.html" title="第 9 章 组件(Component)映射"><link rel="next" href="objectstate.html" title="第 11 章 与对象共事"></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">第 10 章 继承映射(Inheritance Mappings)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="components.html">上一页</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="objectstate.html">下一页</a></td></tr></table><hr></div><div class="chapter" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title"><a name="inheritance"></a>第 10 章 继承映射(Inheritance Mappings)</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="inheritance-strategies"></a>10.1. 三种策略</h2></div></div><div></div></div><p> Hibernate支持三种基本的继承映射策略: </p><div class="itemizedlist"><ul type="disc"><li><p> 每个类分层结构一张表(table per class hierarchy) </p></li><li><p> 每个子类一张表(table per subclass) </p></li><li><p> 每个具体类一张表(table per concrete class) </p></li></ul></div><p> 此外,Hibernate还支持第四种稍有不同的多态映射策略: </p><div class="itemizedlist"><ul type="disc"><li><p> 隐式多态(implicit polymorphism) </p></li></ul></div><p> 对于同一个继承层次内的不同分支,可以采用不同的映射策略,然后用隐式多 态来完成跨越整个层次的多态。但是在同一个<tt class="literal"><class></tt>根元素 下,Hibernate不支持混合了元素<tt class="literal"><subclass></tt>、 <tt class="literal"><joined-subclass></tt>和<tt class="literal"><union-subclass></tt> 的映射。在同一个<tt class="literal"><class></tt>元素下,可以混合使用 “每个类分层结构一张表”(table per hierarchy) 和“每个子类一张表”(table per subclass) 这两种映射策略,这是通过结合元素<tt class="literal"><subclass></tt>和 <tt class="literal"><join></tt>来实现的(见后)。 </p><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="inheritance-tableperclass"></a>10.1.1. 每个类分层结构一张表(Table per class hierarchy)</h3></div></div><div></div></div><p> 假设我们有接口<tt class="literal">Payment</tt>和它的几个实现类: <tt class="literal">CreditCardPayment</tt>, <tt class="literal">CashPayment</tt>, 和<tt class="literal">ChequePayment</tt>。则“每个类分层结构一张表”(Table per class hierarchy)的映射代码如下所示: </p><pre class="programlisting"><class name="Payment" table="PAYMENT"> <id name="id" type="long" column="PAYMENT_ID"> <generator class="native"/> </id> <discriminator column="PAYMENT_TYPE" type="string"/> <property name="amount" column="AMOUNT"/> ... <subclass name="CreditCardPayment" discriminator-value="CREDIT"> <property name="creditCardType" column="CCTYPE"/> ... </subclass> <subclass name="CashPayment" discriminator-value="CASH"> ... </subclass> <subclass name="ChequePayment" discriminator-value="CHEQUE"> ... </subclass></class></pre><p> 采用这种策略只需要一张表即可。它有一个很大的限制:要求那些由子类定义的字段, 如<tt class="literal">CCTYPE</tt>,不能有<tt class="literal">非空(NOT NULL)</tt>约束。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="inheritance-tablepersubclass"></a>10.1.2. 每个子类一张表(Table per subclass)</h3></div></div><div></div></div><p> 对于上例中的几个类而言,采用“每个子类一张表”的映射策略,代码如下所示: </p><pre class="programlisting"><class name="Payment" table="PAYMENT"> <id name="id" type="long" column="PAYMENT_ID"> <generator class="native"/> </id> <property name="amount" column="AMOUNT"/> ... <joined-subclass name="CreditCardPayment" table="CREDIT_PAYMENT"> <key column="PAYMENT_ID"/> ... </joined-subclass> <joined-subclass name="CashPayment" table="CASH_PAYMENT"> <key column="PAYMENT_ID"/> <property name="creditCardType" column="CCTYPE"/> ... </joined-subclass> <joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT"> <key column="PAYMENT_ID"/> ... </joined-subclass></class></pre><p> 需要四张表。三个子类表通过主键关联到超类表(因而关系模型实际上是一对一关联)。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="inheritance-tablepersubclass-discriminator"></a>10.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator)</h3></div></div><div></div></div><p> 注意,对“每个子类一张表”的映射策略,Hibernate的实现不需要辨别字段,而其他 的对象/关系映射工具使用了一种不同于Hibernate的实现方法,该方法要求在超类 表中有一个类型辨别字段(type discriminator column)。Hibernate采用的方法更 难实现,但从关系(数据库)这点上来看,按理说它更正确。若你愿意使用带有辨别字 段的“每个子类一张表”的策略,你可以结合使用<tt class="literal"><subclass></tt> 与<tt class="literal"><join></tt>,如下所示: </p><pre class="programlisting"><class name="Payment" table="PAYMENT"> <id name="id" type="long" column="PAYMENT_ID"> <generator class="native"/> </id> <discriminator column="PAYMENT_TYPE" type="string"/> <property name="amount" column="AMOUNT"/> ... <subclass name="CreditCardPayment" discriminator-value="CREDIT"> <join table="CREDIT_PAYMENT"> <property name="creditCardType" column="CCTYPE"/> ... </join> </subclass> <subclass name="CashPayment" discriminator-value="CASH"> <join table="CASH_PAYMENT"> ... </join> </subclass> <subclass name="ChequePayment" discriminator-value="CHEQUE"> <join table="CHEQUE_PAYMENT" fetch="select"> ... </join> </subclass></class></pre><p> 可选的声明<tt class="literal">fetch="select"</tt>,是用来告诉Hibernate,在查询超类时, 不要使用外部连接(outer join)来抓取子类<tt class="literal">ChequePayment</tt>的数据。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="inheritance-mixing-tableperclass-tablepersubclass"></a>10.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表”</h3></div></div><div></div></div><p> 你甚至可以采取如下方法混和使用“每个类分层结构一张表”和“每个子类一张表”这两种策略: </p><pre class="programlisting"><class name="Payment" table="PAYMENT"> <id name="id" type="long" column="PAYMENT_ID"> <generator class="native"/> </id> <discriminator column="PAYMENT_TYPE" type="string"/> <property name="amount" column="AMOUNT"/> ... <subclass name="CreditCardPayment" discriminator-value="CREDIT"> <join table="CREDIT_PAYMENT"> <property name="creditCardType" column="CCTYPE"/> ... </join> </subclass> <subclass name="CashPayment" discriminator-value="CASH">
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -