Hibernate對映類繼承之每個類層次結構一張表(父子類共用一張表,一個對映檔案)
阿新 • • 發佈:2019-02-01
整個類層次結構可以被對映到單張表。這張表把所有類的所有屬性的列都包括在層次結構中。由特定行表示的具體子類通過一個型別辨別標誌列的值進行識別。這個對映策略在效能和簡單性方面都勝出一籌。它是表示多型的最佳方法---多型和非多型的查詢都執行得很好---並且更易於手工實現。不用複雜的聯結或者聯合也有可能生成特殊的報表。有一個重大的問題:子類宣告的屬性的列必須宣告為可為空。
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.
必須新增一個特殊的列以便在持久化類之間進行區分:辨別標誌(discriminator)。這不是持久化類的屬性,由hibernate內部使用。列名為BILLING_DETAILS_TYPE,值為字串---在這個例子中,為"CC"或者"BA"。hibernate自動設定和獲取辨別標誌的值。
關於超類的屬性,用簡單的<property>元素對映.
每個子類都有自己的<subclass>元素。子類的屬性被對映到BILLING_DETAILS表中的列。記住不允許NOT NULL約束,因為BankAccount例項不會有expMonth屬性,且該行的CC_EXP_MONTH欄位必須為NULL.
<subclass>元素可以依次包含其它被巢狀的<subclass>元素,直到整個層次結構被對映到表中。
請注意,這裡只有一個表:BILLING_DETAILS ,包含了所有屬性或欄位。
BILLING_DETAILS表:
BILLING_DETAILS_ID
BILLING_DETAILS_TYPE
OWNER
CC_NUMBER
CC_EXP_MONTH
CC_EXP_YEAR
BA_ACCOUNT
BA_BANKNAME
BA_SWIFT