这种方案是把继承关系表示为相关的外键关联。声明持久化属性的每个类/子类(包括抽象类甚至接口)都有它自己的表。不同于我们先前例子映射的每个具体类一张表的策略,此处的表仅仅包含了每个非继承的属性(由子类本身声明的每个属性)以及也是超类表的外键的主键的列。
如例CreditCard子类的一个实例变成持久化,由BillingDetails超类声明的属性值就被持久化到BILLING_DETAILS表的一个新行。只有子类声明的属性值被持久化到CREDIT_CARD表的一个新行。这两行通过它们的共享主键值链接在一起。
注意,这里有三个表,BILLING_DETAILS, CREDIT_CARD, BANK_ACCOUNT.
pom.xml:
hibernate.cfg.xml:
父类, pojo/BillingDetails.java:
子类,pojo/BankAccount.java:
子类,pojo/CreditCard.java:
映射文件,pojo/BillingDetails.hbm.xml:
util/HibernateUtil.java:
util/Manager.java:
输出的sql日志:
请注意输出的sql.
上例中,根类BillingDetails被映射到表BILLING_DETAILS。注意这个策略不需要辨别标志。
新的<joined-subclass>元素把子类映射到新的表---在这个例子中为CREDIT_CARD, BANK_ACCOUNT.在被联结的子类中声明的所有属性都被映射到各自的表。CREDIT_CARD, BANK_ACCOUNT表需要主键。这个列也有一个对BILLING_DEAILS表的主键的外键约束。
BILLING_DETAILS表:
BILLING_DETAILS_ID
OWNER
CREDIT_CARD表:
CREDIT_CARD_ID
NUMBER
EXP_MONTH
EXP_YEAR
BANK_ACCOUNT表:
BANK_ACCOUNT_ID
ACCOUNT
BANKNAME
SWIFT