淺析Hibernate映射(三)——繼承映射

 

對象模型示例:html

繼承映射的實現方式有三種:數據庫

(一)每棵類繼承樹一張表app

關係模型:spa

映射文件:.net

[html]  view plain copy print ?
 
  1. <hibernate-mapping package="com.jialin.hibernate">  
  2.     <class name="Animal" table="t_animal" lazy="false">  
  3.         <id name="id">  
  4.             <generator class="native"/>  
  5.         </id>  
  6.         <discriminator column="type" type="string"/>  
  7.         <property name="name"/>  
  8.         <property name="sex"/>  
  9.         <subclass name="Pig" discriminator-value="P">  
  10.             <property name="weight"/>  
  11.         </subclass>  
  12.         <subclass name="Bird" discriminator-value="B">  
  13.             <property name="height"/>  
  14.         </subclass>  
  15.     </class>  
  16. </hibernate-mapping>  

說明:hibernate

由於類繼承樹確定是對應多個類,要把多個類的信息存放在一張表中,必須有某種機制來區分哪些記錄是屬於哪一個類的。這種機制就是,在表中添加一個字段,用這個字段的值來進行區分。xml

用hibernate實現這種策略的時候,有以下步驟:
一、父類用普通的<class>標籤訂義htm

二、在父類中定義一個discriminator,即指定這個區分的字段的名稱和類型
如:<discriminator column=」XXX」 type=」string」/>對象


三、子類使用<subclass>標籤訂義,在定義subclass的時候,須要注意以下幾點:blog

*Subclass標籤的name屬性是子類的全路徑名
*在Subclass標籤中,用discriminator-value屬性來標明本子類的discriminator字段(用來區分不一樣類的字段)的值

*Subclass既能夠被class標籤所包含(這種包含關係正是代表了類之間的繼承關係),也能夠與class標籤平行。當subclass標籤的定義與class標籤平行的時候,須要在subclass標籤中,添加extends屬性,裏面的值是父類的全路徑名稱。
*子類的其它屬性,像普通類同樣,定義在subclass標籤的內部。

*關於鑑別值在存儲的時候hibernate會自動存儲,在加載的時候會根據鑑別值取得相關的對象

(二)每一個類一張表

關係模型:

映射文件:

[html]  view plain copy print ?
 
  1. <hibernate-mapping package="com.jialin.hibernate">  
  2.     <class name="Animal" table="t_animal">  
  3.         <id name="id">  
  4.             <generator class="native"/>  
  5.         </id>  
  6.         <property name="name"/>  
  7.         <property name="sex"/>  
  8.         <joined-subclass name="Pig" table="t_pig">  
  9.             <key column="pid"/>  
  10.             <property name="weight"/>  
  11.         </joined-subclass>  
  12.         <joined-subclass name="Bird" table="t_bird">  
  13.             <key column="bid"/>  
  14.             <property name="height"/>  
  15.         </joined-subclass>  
  16.     </class>  
  17. </hibernate-mapping>  

說明:

這種策略是使用joined-subclass標籤來定義子類的。父類、子類,每一個類都對應一張數據庫表。
在父類對應的數據庫表中,實際上會存儲全部的記錄,包括父類和子類的記錄;在子類對應的數據庫表中,這個表只定義了子類中所特有的屬性映射的字段。子類與父類,經過相同的主鍵值來關聯。

實現這種策略的時候,有以下步驟:
一、父類用普通的<class>標籤訂義便可
二、父類再也不須要定義discriminator字段
三、子類用<joined-subclass>標籤訂義,在定義joined-subclass的時候,須要注意以下幾點:
*Joined-subclass標籤的name屬性是子類的全路徑名
*Joined-subclass標籤須要包含一個key標籤,這個標籤指定了子類和父類之間是經過哪一個字段來關聯的。如:<key column=」PARENT_KEY_ID」/>,這裏的column,實際上就是父類的主鍵對應的映射字段名稱。
*Joined-subclass標籤,既能夠被class標籤所包含(這種包含關係正是代表了類之間的繼承關係),
也能夠與class標籤平行。 當Joined-subclass標籤的定義與class標籤平行的時候,
須要在Joined-subclass標籤中,添加extends屬性,裏面的值是父類的全路徑名稱。
子類的其它屬性,像普通類同樣,定義在joined-subclass標籤的內部。

(三)每一個子類一張表

關係模型:

映射文件:

[html]  view plain copy print ?
 
  1. <hibernate-mapping package="com.jialin.hibernate">  
  2.     <class name="Animal" table="t_animal" abstract="true">  
  3.         <id name="id">  
  4.             <generator class="assigned"/>  
  5.         </id>  
  6.         <property name="name"/>  
  7.         <property name="sex"/>  
  8.         <union-subclass name="Pig" table="t_pig">  
  9.             <property name="weight"/>  
  10.         </union-subclass>  
  11.         <union-subclass name="Bird" table="t_bird">  
  12.             <property name="height"/>  
  13.         </union-subclass>  
  14.     </class>  
  15. </hibernate-mapping>  


說明:

這種策略是使用union-subclass標籤來定義子類的。每一個子類對應一張表,並且這個表的信息是完備的,
即包含了全部從父類繼承下來的屬性映射的字段(這就是它跟joined-subclass的不一樣之處,joined-subclass定義的子類的表,只包含子類特有屬性映射的字段)。

實現這種策略的時候,有以下步驟:
一、父類用普通<class>標籤訂義便可
二、子類用<union-subclass>標籤訂義,在定義union-subclass的時候,須要注意以下幾點:
*Union-subclass標籤再也不須要包含key標籤(與joined-subclass不一樣)
*Union-subclass標籤,既能夠被class標籤所包含(這種包含關係正是代表了類之間的繼承關係),
也能夠與class標籤平行。 當Union-subclass標籤的定義與class標籤平行的時候,須要在Union-subclass標籤中,
添加extends屬性,裏面的值是父類的全路徑名稱。
*子類的其它屬性,像普通類同樣,定義在Union-subclass標籤的內部。這個時候,雖然在union-subclass
裏面定義的只有子類的屬性,可是由於它繼承了父類,因此,不須要定義其它的屬性,在映射到數據庫表的時候,
依然包含了父類的全部屬性的映射字段。

注意:在保存對象的時候id不能重複(不能使用數據庫的自增方式生成主鍵)

相關文章
相關標籤/搜索