9.1.1. 每个类分层结构一张表(Table per class hierarchy)

假设我们有接口Payment和它的几个实现类: CreditCardPayment, CashPayment, 和ChequePayment。则“每个类分层结构一张表”(Table per class hierarchy)的映射代码如下所示:

  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. <property name="creditCardType" column="CCTYPE"/>
  10. ...
  11. </subclass>
  12. <subclass name="CashPayment" discriminator-value="CASH">
  13. ...
  14. </subclass>
  15. <subclass name="ChequePayment" discriminator-value="CHEQUE">
  16. ...
  17. </subclass>
  18. </class>

采用这种策略只需要一张表即可。它有一个很大的限制:要求那些由子类定义的字段, 如CCTYPE,不能有非空(NOT NULL)约束。