1. 程式人生 > >Hibernate對映類繼承之每個類層次結構一張表(父子類共用一張表,一個對映檔案)

Hibernate對映類繼承之每個類層次結構一張表(父子類共用一張表,一個對映檔案)

整個類層次結構可以被對映到單張表。這張表把所有類的所有屬性的列都包括在層次結構中。由特定行表示的具體子類通過一個型別辨別標誌列的值進行識別。這個對映策略在效能和簡單性方面都勝出一籌。它是表示多型的最佳方法---多型和非多型的查詢都執行得很好---並且更易於手工實現。不用複雜的聯結或者聯合也有可能生成特殊的報表。有一個重大的問題:子類宣告的屬性的列必須宣告為可為空。 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