Hibernate對映類繼承之每個類一張表(父子類都有各自的表,並共用一個對映檔案)
阿新 • • 發佈:2019-01-26
這種方案是把繼承關係表示為相關的外來鍵關聯。宣告持久化屬性的每個類/子類(包括抽象類甚至介面)都有它自己的表。不同於我們先前例子對映的每個具體類一張表的策略,此處的表僅僅包含了每個非繼承的屬性(由子類本身宣告的每個屬性)以及也是超類表的外來鍵的主鍵的列。
如例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