9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator)

注意,对“每个子类一张表”的映射策略,Hibernate的实现不需要辨别字段,而其他 的对象/关系映射工具使用了一种不同于Hibernate的实现方法,该方法要求在超类 表中有一个类型辨别字段(type discriminator column)。Hibernate采用的方法更 难实现,但从关系(数据库)的角度来看,按理说它更正确。若你愿意使用带有辨别字 段的“每个子类一张表”的策略,你可以结合使用<subclass><join>,如下所示:

  1. <class name="Payment" table="PAYMENT">
  2. <id name="id" type="long" column="PAYMENT_ID">
  3. <generator class="native"/>
  4. </id>
  5. <discriminator column="PAYMENT_TYPE" type="string"/>
  6. <property name="amount" column="AMOUNT"/>
  7. ...
  8. <subclass name="CreditCardPayment" discriminator-value="CREDIT">
  9. <join table="CREDIT_PAYMENT">
  10. <key column="PAYMENT_ID"/>
  11. <property name="creditCardType" column="CCTYPE"/>
  12. ...
  13. </join>
  14. </subclass>
  15. <subclass name="CashPayment" discriminator-value="CASH">
  16. <join table="CASH_PAYMENT">
  17. <key column="PAYMENT_ID"/>
  18. ...
  19. </join>
  20. </subclass>
  21. <subclass name="ChequePayment" discriminator-value="CHEQUE">
  22. <join table="CHEQUE_PAYMENT" fetch="select">
  23. <key column="PAYMENT_ID"/>
  24. ...
  25. </join>
  26. </subclass>
  27. </class>

可选的声明fetch="select",是用来告诉Hibernate,在查询超类时, 不要使用外部连接(outer join)来抓取子类ChequePayment的数据。