📄 inheritance.html
字号:
与<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"> <key column="PAYMENT_ID"/> <property name="creditCardType" column="CCTYPE"/> ... </join> </subclass> <subclass name="CashPayment" discriminator-value="CASH"> <join table="CASH_PAYMENT"> <key column="PAYMENT_ID"/> ... </join> </subclass> <subclass name="ChequePayment" discriminator-value="CHEQUE"> <join table="CHEQUE_PAYMENT" fetch="select"> <key column="PAYMENT_ID"/> ... </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>9.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"> ... </subclass> <subclass name="ChequePayment" discriminator-value="CHEQUE"> ... </subclass></class></pre><p> 对上述任何一种映射策略而言,指向根类<tt class="literal">Payment</tt>的 关联是使用<tt class="literal"><many-to-one></tt>进行映射的。 </p><pre class="programlisting"><many-to-one name="payment" column="PAYMENT_ID" class="Payment"/></pre></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="inheritance-tableperconcrete"></a>9.1.5. 每个具体类一张表(Table per concrete class)</h3></div></div><div></div></div><p> 对于“每个具体类一张表”的映射策略,可以采用两种方法。第一种方法是使用 <tt class="literal"><union-subclass></tt>。 </p><pre class="programlisting"><class name="Payment"> <id name="id" type="long" column="PAYMENT_ID"> <generator class="sequence"/> </id> <property name="amount" column="AMOUNT"/> ... <union-subclass name="CreditCardPayment" table="CREDIT_PAYMENT"> <property name="creditCardType" column="CCTYPE"/> ... </union-subclass> <union-subclass name="CashPayment" table="CASH_PAYMENT"> ... </union-subclass> <union-subclass name="ChequePayment" table="CHEQUE_PAYMENT"> ... </union-subclass></class></pre><p> 这里涉及三张与子类相关的表。每张表为对应类的所有属性(包括从超类继承的属性)定义相应字段。 </p><p> 这种方式的局限在于,如果一个属性在超类中做了映射,其字段名必须与所有子类 表中定义的相同。(我们可能会在Hibernate的后续发布版本中放宽此限制。) 不允许在联合子类(union subclass)的继承层次中使用标识生成器策略(identity generator strategy), 实际上, 主键的种子(primary key seed)不得不为同一继承层次中的全部被联合子类所共用. </p><p> 假若超类是抽象类,请使用<tt class="literal">abstract="true"</tt>。当然,假若它不是抽象的,需要一个额外的表(上面的例子中,默认是<tt class="literal">PAYMENT</tt>),来保存超类的实例。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="inheritance-tableperconcreate-polymorphism"></a>9.1.6. Table per concrete class, using implicit polymorphism</h3></div><div><h3 class="title"><a name="inheritance-tableperconcreate-polymorphism"></a>9.1.6. Table per concrete class, using implicit polymorphism</h3></div></div><div></div></div><p> 另一种可供选择的方法是采用隐式多态: </p><pre class="programlisting"><class name="CreditCardPayment" table="CREDIT_PAYMENT">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -