對象模型示例:html
繼承映射的實現方式有三種:數據庫
(一)每棵類繼承樹一張表app
關係模型:spa
映射文件:.net
說明: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會自動存儲,在加載的時候會根據鑑別值取得相關的對象
(二)每一個類一張表
關係模型:
映射文件:
說明:
這種策略是使用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標籤的內部。
(三)每一個子類一張表
關係模型:
映射文件:
說明:
這種策略是使用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不能重複(不能使用數據庫的自增方式生成主鍵)