📄 inheritance.html
字号:
</id> <property name="amount" column="CASH_AMOUNT"/> ...</class><class name="ChequePayment" table="CHEQUE_PAYMENT"> <id name="id" type="long" column="CHEQUE_PAYMENT_ID"> <generator class="native"/> </id> <property name="amount" column="CHEQUE_AMOUNT"/> ...</class></pre><p> 需要三个表。注意我们没有明确的定义<tt class="literal">Payment</tt>接口。我们用Hibernate的<span class="emphasis"><em>隐含多态(implicit polymorphism)</em></span>机制代替。也要注意<tt class="literal">Payment</tt>的属性在三个字类中都进行了映射。 </p><p> 这种情形下,与<tt class="literal">Payment</tt>关联的多态关联被映射为<tt class="literal"><any></tt>。 </p><pre class="programlisting"><any name="payment" meta-type="class" id-type="long"> <column name="PAYMENT_CLASS"/> <column name="PAYMENT_ID"/></any></pre><p> 如果我们定义<tt class="literal">UserType</tt>和<tt class="literal">meta-type</tt>来根据不同的标识字符串映射到<tt class="literal">Payment</tt>,事情会更好一些。 </p><pre class="programlisting"><any name="payment" meta-type="PaymentMetaType" id-type="long"> <column name="PAYMENT_TYPE"/> <!-- CREDIT, CASH or CHEQUE --> <column name="PAYMENT_ID"/></any></pre><p> 对这个映射还有一点需要注意。因为每个子类都在各自独立的<tt class="literal"><class></tt>元素中映射(并且<tt class="literal">Payment</tt>只是个接口),每个子类都可以和容易的成为另一个"每个类一个表"或者"每个子类一个表"的继承树!(并且你仍然可以对<tt class="literal">Payment</tt>接口使用多态查询。) </p><pre class="programlisting"><class name="CreditCardPayment" table="CREDIT_PAYMENT"> <id name="id" type="long" column="CREDIT_PAYMENT_ID"> <generator class="native"/> </id> <discriminator column="CREDIT_CARD" type="string"/> <property name="amount" column="CREDIT_AMOUNT"/> ... <subclass name="MasterCardPayment" discriminator-value="MDC"/> <subclass name="VisaPayment" discriminator-value="VISA"/></class><class name="NonelectronicTransaction" table="NONELECTRONIC_TXN"> <id name="id" type="long" column="TXN_ID"> <generator class="native"/> </id> ... <joined-subclass name="CashPayment" table="CASH_PAYMENT"> <key column="PAYMENT_ID"/> <property name="amount" column="CASH_AMOUNT"/> ... </joined-subclass> <joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT"> <key column="PAYMENT_ID"/> <property name="amount" column="CHEQUE_AMOUNT"/> ... </joined-subclass></class></pre><p> 我们再一次没有明确的提到<tt class="literal">Payment</tt>。如果我们针对<tt class="literal">Payment</tt>接口执行查询 ——比如,<tt class="literal">from Payment</tt>—— Hibernate自动返回<tt class="literal">CreditCardPayment</tt>实例(以及它的子类,因为它们也继承了<tt class="literal">Payment</tt>),<tt class="literal">CashPayment</tt>和<tt class="literal">Chequepayment</tt>,但是不会是<tt class="literal">NonelectronicTransaction</tt>的实例。 </p></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="inheritance-limitations"></a>8.2. 限制</h2></div></div><div></div></div><p> Hibernate假设关联严格的和一个外键字段相映射。如果一个外键具有多个关联,也是可以容忍的(你可能需要指定<tt class="literal">inverse="true"</tt>或者<tt class="literal">insert="false" update="false"</tt>),但是你不能为多重外键指定任何映射的关联。这意味着: </p><div class="itemizedlist"><ul type="disc"><li><p> 当更改一个关联的时候,永远是更新的同一个外键 </p></li><li><p> 当一个关联是延迟抓取(fetched lazily)的时候,只需要用一次数据库查询 </p></li><li><p> 当一个关联是提前抓取(fetched eagerly)的时候,使用一次outer join即可 </p></li></ul></div><p> 特别要指出的是,使用“每个具体类一个表”的策略来实行多态的一对多关联是<span class="emphasis"><em>不支持</em></span>的。(抓取这样的关联需要多次查询或者多次join。) </p><p> 下面的表格列出了Hibernte中,“每个具体类一个表”策略与隐含多态机制的限制。 </p><div class="table"><a name="d0e5663"></a><p class="title"><b>表 8.1. 继承映射特性(Features of inheritance mappings) </b></p><table summary="继承映射特性(Features of inheritance mappings) " border="1"><colgroup><col align="left"><col align="left"><col align="left"><col align="left"><col align="left"><col align="left"><col align="left"><col align="left"></colgroup><thead><tr><th align="left">继承策略(Inheritance strategy)</th><th align="left">多态多对一</th><th align="left">多态一对一</th><th align="left">多态一对多</th><th align="left">多态多对多</th><th align="left">多态 <tt class="literal">load()/get()</tt></th><th align="left">多态查询</th><th align="left">多态连接(join)</th><th align="left">Outer join 抓取</th></tr></thead><tbody><tr><td align="left">每继承树一表</td><td align="left"><tt class="literal"><many-to-one></tt></td><td align="left"><tt class="literal"><one-to-one></tt></td><td align="left"><tt class="literal"><one-to-many></tt></td><td align="left"><tt class="literal"><many-to-many></tt></td><td align="left"><tt class="literal">s.get(Payment.class, id)</tt></td><td align="left"><tt class="literal">from Payment p</tt></td><td align="left"><tt class="literal">from Order o join o.payment p</tt></td><td align="left"><span class="emphasis"><em>支持</em></span></td></tr><tr><td align="left">每子类一表</td><td align="left"><tt class="literal"><many-to-one></tt></td><td align="left"><tt class="literal"><one-to-one></tt></td><td align="left"><tt class="literal"><one-to-many></tt></td><td align="left"><tt class="literal"><many-to-many></tt></td><td align="left"><tt class="literal">s.get(Payment.class, id)</tt></td><td align="left"><tt class="literal">from Payment p</tt></td><td align="left"><tt class="literal">from Order o join o.payment p</tt></td><td align="left"><span class="emphasis"><em>支持</em></span></td></tr><tr><td align="left">每具体类一表(隐含多态)</td><td align="left"><tt class="literal"><any></tt></td><td align="left"><span class="emphasis"><em>不支持</em></span></td><td align="left"><span class="emphasis"><em>不支持</em></span></td><td align="left"><tt class="literal"><many-to-any></tt></td><td align="left"><span class="emphasis"><em>use a query</em></span></td><td align="left"><tt class="literal">from Payment p</tt></td><td align="left"><span class="emphasis"><em>不支持</em></span></td><td align="left"><span class="emphasis"><em>不支持</em></span></td></tr></tbody></table></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="components.html">上一页</a> </td><td width="20%" align="center"><a accesskey="u" href="index.html">上一级</a></td><td width="40%" align="right"> <a accesskey="n" href="manipulatingdata.html">下一页</a></td></tr><tr><td width="40%" align="left" valign="top">第 7 章 组件(Component)映射 </td><td width="20%" align="center"><a accesskey="h" href="index.html">起始页</a></td><td width="40%" align="right" valign="top"> 第 9 章 操作持久化数据(Manipulating Persistent Data)</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -