1. 程式人生 > >Hibernate對映類繼承之每個類一張表(父子類都有各自的表,並共用一個對映檔案)

Hibernate對映類繼承之每個類一張表(父子類都有各自的表,並共用一個對映檔案)

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