9.1.7. 隐式多态和其他继承映射混合使用

对这一映射还有一点需要注意。因为每个子类都在各自独立的元素<class> 中映射(并且Payment只是一个接口),每个子类可以很容易的成为另一 个继承体系中的一部分!(你仍然可以对接口Payment使用多态查询。)

  1. <class name="CreditCardPayment" table="CREDIT_PAYMENT">
  2. <id name="id" type="long" column="CREDIT_PAYMENT_ID">
  3. <generator class="native"/>
  4. </id>
  5. <discriminator column="CREDIT_CARD" type="string"/>
  6. <property name="amount" column="CREDIT_AMOUNT"/>
  7. ...
  8. <subclass name="MasterCardPayment" discriminator-value="MDC"/>
  9. <subclass name="VisaPayment" discriminator-value="VISA"/>
  10. </class>
  11. <class name="NonelectronicTransaction" table="NONELECTRONIC_TXN">
  12. <id name="id" type="long" column="TXN_ID">
  13. <generator class="native"/>
  14. </id>
  15. ...
  16. <joined-subclass name="CashPayment" table="CASH_PAYMENT">
  17. <key column="PAYMENT_ID"/>
  18. <property name="amount" column="CASH_AMOUNT"/>
  19. ...
  20. </joined-subclass>
  21. <joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT">
  22. <key column="PAYMENT_ID"/>
  23. <property name="amount" column="CHEQUE_AMOUNT"/>
  24. ...
  25. </joined-subclass>
  26. </class>

我们还是没有明确的提到Payment。 如果我们针对接口Payment执行查询 ——如from Payment—— Hibernate 自动返回CreditCardPayment(和它的子类,因为 它们也实现了接口Payment)、 CashPaymentChequepayment的实例, 但不返回NonelectronicTransaction的实例。