Hibernate中支持3種類型的繼承形式:
1.Table per concrete class
表與子類之間的獨立一對一關系。
2.Table per subclass
每個子類對應一張子表,并與主類共享主表。
3.Table per class hierarchy
表與類的一對多關系
3種方法的比較。
比較方面
|
Table per concrete class
|
Table per subclass
|
Table per class hierarchy
|
關系數據模型的復雜度
|
缺點:表中含有重復字段
|
缺點:表的數目最多,并且表之間還有外鍵 參照關系
|
優點:只需要一個表
|
查詢性能
|
缺點:查詢父類對象,也必須查詢所有具體的 子類對應的表
|
缺點:需要進行表的內連接或者左外連接
|
優點:無需表連接,查詢性能好
|
數據庫Schema的可維護性
|
缺點:父類發生修改,必須修改所有子類的表
|
優點:某個類的屬性發生變化,只需修改和這個類對應的表
|
優點:只需要修改一張表
|
是否支持多態查詢和關聯
|
缺點:不支持(實際上,是可以做到的,做法是指定完整的父類路徑,參見具體例子實現)
|
優點:支持
|
優點:支持
|
是否符合關系數據模型的常規設計
|
優點:符合
|
優點:符合
|
缺點: 1)在表中,引入額外的區分子類的類型的字段 2)如果子類中的某個屬性不允許為null,在表中 無法為對應的字段創建not null約束
|
配置文件說明
|
無需變化
|
使用joined-subclass節點來說明
|
使用discriminator節點來說明
|
下面,結合一個例子,分別討論。
對一個電子商務系統而言,不同的的貨物既有共性,也有各自不同的屬性。貨物都有廠商,名稱等屬性,而書籍有頁數,DVD有分區屬性。在面向對象的程序設計中,我們通常將共性抽象為一個基類,而以不同的子類體現具體的特性。
共性歸為父類TItem,屬性如下:
id:Integer
factory:String
name:String
代表書籍的子類TBook,屬性如下:
pageCount:int
代表DVD的字類TDVD,屬性如下:
regionCode:String
這三個POJO類對應的Java代碼如下:
父類TItem.java
package?cn.blogjava.start;
import?java.io.Serializable;
public?class?TItem?implements?Serializable?{
????private?Integer?id;
????private?String?manufacturer;
????private?String?name;
????
????public?Integer?getId()?{
????????return?id;
????}
????public?void?setId(Integer?id)?{
????????this.id?=?id;
????}
????public?String?getManufacturer()?{
????????return?manufacturer;
????}
????public?void?setManufacturer(String?manufacturer)?{
????????this.manufacturer?=?manufacturer;
????}
????public?String?getName()?{
????????return?name;
????}
????public?void?setName(String?name)?{
????????this.name?=?name;
????}
????
}
子類TBook
package?cn.blogjava.start;
import?java.io.Serializable;
public?class?TBook?extends?TItem?implements?Serializable?{
????private?int?pageCount;
????public?int?getPageCount()?{
????????return?pageCount;
????}
????public?void?setPageCount(int?pageCount)?{
????????this.pageCount?=?pageCount;
????}????
}
子類TDVD
package?cn.blogjava.start;
import?java.io.Serializable;
public?class?TDVD?extends?TItem?implements?Serializable{
????private?String?regionCode;
????public?String?getRegionCode()?{
????????return?regionCode;
????}
????public?void?setRegionCode(String?regionCode)?{
????????this.regionCode?=?regionCode;
????}
????
????
}
下面使用3種不同方式,一一實現。
posted on 2006-07-05 14:58
knowhow 閱讀(218)
評論(0) 編輯 收藏 所屬分類:
ORM:Hibernate及其他