📄 inheritance.html
字号:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Chapter 16. 继承映射(Inheritance Mappings)</title><link rel="stylesheet" href="../styles/html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.60.1"><link rel="home" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="up" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="previous" href="query-sql.html" title="Chapter 15. SQL查询"><link rel="next" href="transactions.html" title="Chapter 17. 事务和并行(Transactions And Concurrency)"></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">Chapter 16. 继承映射(Inheritance Mappings)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="query-sql.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="transactions.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="inheritance"></a>Chapter 16. 继承映射(Inheritance Mappings)</h2></div></div><div></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="inheritance-s1"></a>16.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不支持把<tt class="literal"><subclass></tt>映射与<tt class="literal"><joined-subclass></tt>在同一个<tt class="literal"><class></tt> 元素中混合使用。 </p><p> 假设我们有一个<tt class="literal">Payment</tt>接口,有不同的实现:<tt class="literal">CreditCardPayment</tt>, <tt class="literal">CashPayment</tt>, <tt class="literal">ChequePayment</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"> ... </subclass> <subclass name="CashPayment" discriminator-value="CASH"> ... </subclass> <subclass name="ChequePayment" discriminator-value="CHEQUE"> ... </subclass></class></pre><p> 只需要一个表。这种映射策略由一个大限制:子类定义的字段不能有<tt class="literal">NOT NULL</tt>限制。 </p><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"/> ... </subclass> <joined-subclass name="CashPayment" table="CASH_PAYMENT"> <key column="PAYMENT_ID"/> ... </subclass> <joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT"> <key column="PAYMENT_ID"/> ... </subclass></class></pre><p> 需要四个表。三个子类表通过主键和超类表关联(所以实际上关系模型是一对一关联)。 </p><p> 注意Hibernate的“每子类一表”的实现并不需要一个特别的辨认字段。其他的对象/关系数据库映射工具使用另一种“每子类一表”实现,需要在超类表中有一个类型辨认字段。Hibernate的这种实现更加困难,但是从关系(数据库)的角度来看,这样做更加正确。 </p><p> 对这两种映射策略来说,指向<tt class="literal">Payment</tt>的关联是使用<tt class="literal"><many-to-one></tt>进行映射的。 </p><pre class="programlisting"><many-to-one name="payment" column="PAYMENT" class="Payment"/></pre><p>“每个具体类一个表”的策略非常不同</p><pre class="programlisting"><class name="CreditCardPayment" table="CREDIT_PAYMENT"> <id name="id" type="long" column="CREDIT_PAYMENT_ID"> <generator class="native"/> </id> <property name="amount" column="CREDIT_AMOUNT"/> ...</class><class name="CashPayment" table="CASH_PAYMENT"> <id name="id" type="long" column="CASH_PAYMENT_ID"> <generator class="native"/>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -