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 閱讀(220) 評論(0)  編輯  收藏 所屬分類: ORM:Hibernate及其他
          主站蜘蛛池模板: 花莲县| 梁河县| 宽甸| 宁安市| 达尔| 景德镇市| 景泰县| 永善县| 怀化市| 廉江市| 衢州市| 府谷县| 尉氏县| 二连浩特市| 扶沟县| 奈曼旗| 老河口市| 襄樊市| 营口市| 崇州市| 孟州市| 新乐市| 巫溪县| 达尔| 滦南县| 郎溪县| 岑巩县| 昭通市| 甘泉县| 中宁县| 同德县| 攀枝花市| 丰原市| 武邑县| 晋中市| 西充县| 监利县| 冀州市| 丹寨县| 朝阳市| 仲巴县|