9.1.6. Table per concrete class, using implicit polymorphism

另一种可供选择的方法是采用隐式多态:

  1. <class name="CreditCardPayment" table="CREDIT_PAYMENT">
  2. <id name="id" type="long" column="CREDIT_PAYMENT_ID">
  3. <generator class="native"/>
  4. </id>
  5. <property name="amount" column="CREDIT_AMOUNT"/>
  6. ...
  7. </class>
  8. <class name="CashPayment" table="CASH_PAYMENT">
  9. <id name="id" type="long" column="CASH_PAYMENT_ID">
  10. <generator class="native"/>
  11. </id>
  12. <property name="amount" column="CASH_AMOUNT"/>
  13. ...
  14. </class>
  15. <class name="ChequePayment" table="CHEQUE_PAYMENT">
  16. <id name="id" type="long" column="CHEQUE_PAYMENT_ID">
  17. <generator class="native"/>
  18. </id>
  19. <property name="amount" column="CHEQUE_AMOUNT"/>
  20. ...
  21. </class>

注意,我们没有在任何地方明确的提及接口Payment。同时注意 Payment的属性在每个子类中都进行了映射。如果你想避免重复, 可以考虑使用XML实体(例如:位于DOCTYPE声明内的 [ &lt;!ENTITY allproperties SYSTEM "allproperties.xml"&gt; ] 和映射中的&allproperties;)。

这种方法的缺陷在于,在Hibernate执行多态查询时(polymorphic queries)无法生成带 UNION的SQL语句。

对于这种映射策略而言,通常用&lt;any&gt;来实现到 Payment的多态关联映射。

  1. <any name="payment" meta-type="string" id-type="long">
  2. <meta-value value="CREDIT" class="CreditCardPayment"/>
  3. <meta-value value="CASH" class="CashPayment"/>
  4. <meta-value value="CHEQUE" class="ChequePayment"/>
  5. <column name="PAYMENT_CLASS"/>
  6. <column name="PAYMENT_ID"/>
  7. </any>