国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

精通Hibernate映射繼承關(guān)系之五

2019-11-18 16:11:55
字體:
供稿:網(wǎng)友

  本章介紹的三種映射方式各有優(yōu)缺點,表14-1對這三種映射方式做了比較。




精通Hibernate映射繼承關(guān)系之五(圖一)
點擊查看大圖


表14-1 比較三種映射方式


如果不需要支持多態(tài)查詢和多態(tài)關(guān)聯(lián),可以采用每個具體類對應(yīng)一個表的映射方式,如果需要支持多態(tài)查詢和多態(tài)關(guān)聯(lián),并且子類包含的屬性不多,可以采用根類對應(yīng)一個表的映射方式,如果需要支持多態(tài)查詢和多態(tài)關(guān)聯(lián),并且子類包含的屬性很多,可以采用每個類對應(yīng)一個表的映射方式。如果繼承關(guān)系樹中包含接口,可以把它當(dāng)做抽象類來處理。

圖14-9顯示了一棵復(fù)雜的繼承關(guān)系樹,其中DOClass類為抽象類,其他均為具體類。

精通Hibernate映射繼承關(guān)系之五(圖二)


圖14-9 復(fù)雜的繼承關(guān)系樹
可以將圖14-9的繼承關(guān)系樹分解為3棵子樹:

DOClass類、ClassA類和ClassB類為一棵子樹:DOClass類為抽象類,位于整個繼承關(guān)系樹的頂層,通常不會對它進(jìn)行多態(tài)查詢,因此可以采用每個具體類對應(yīng)一個表的映射方式,ClassA類對應(yīng)TABLE_A表,ClassB類對應(yīng)TABLE_B表。

ClassA類、ClassC類、ClassD類、ClassG類和ClassH類為一棵子樹:ClassA類的所有子類都只包含少量屬性,因此可以采用根類對應(yīng)一個表的映射方式,ClassA類對應(yīng)TABLE_A表。

ClassB類、ClassE類和ClassF為一棵子樹:ClassB類的兩個子類都包含很多屬性,因此采用每個類對應(yīng)一個表的映射方式,ClassB類對應(yīng)TABLE_B表,ClassE類對應(yīng)TABLE_E表,ClassF類對應(yīng)TABLE_F表。

如圖14-10所示,在關(guān)系數(shù)據(jù)模型中,只需創(chuàng)建TABLE_A、TABLE_B、TABLE_E和TABLE_F表,其中TABLE_A中包含了與DOClass、ClassA、ClassC、ClassD、ClassG和ClassH的屬性對應(yīng)的字段。TABLE_B中包含了與DOClass和ClassB的屬性對應(yīng)的字段,TABLE_E和TABLE_F的B_ID字段既是主鍵,又是參照TABLE_B表的外鍵。

精通Hibernate映射繼承關(guān)系之五(圖三)


圖14-10 復(fù)雜繼承關(guān)系樹對應(yīng)的關(guān)系數(shù)據(jù)模型


只需創(chuàng)建兩個映射文件,ClassA.hbm.xml和ClassB.hbm.xml,例程14-9和例程14-10分別為它們的源代碼。

例程14-9 ClassA.hbm.xml
<hibernate-mapping >      <class name="mypack.ClassA" table="TABLE_A" discriminator-value="A" >      <id name="id" type="long" column="ID">        <generator class="increment"/>      </id>      <discriminator column="A_TYPE" type="string"  />        <PRoperty name="a1" type="string" column="A1" />      <subclass name="mypack.ClassC" discriminator-value="C" >         <property name="c1" column="C1" type="string" />      </subclass>      <subclass name="mypack.ClassD" discriminator-value="D" >      <property name="d1" column="D1" type="string" />       <subclass name="mypack.ClassG" discriminator-value="G" >      <property name="g1" column="G1" type="string" />      </subclass>              <subclass name="mypack.ClassH" discriminator-value="H" >      <property name="h1" column="H1" type="string" />      </subclass>      </subclass>      </class>      </hibernate-mapping>



例程14-10 ClassB.hbm.xml

 
<hibernate-mapping >      <class name="mypack.ClassB" table="TABLE_B">      <id name="id" type="long" column="ID">      <generator class="increment"/>      </id>      <property name="b1" type="string" column="B1" />      <joined-subclass name="mypack.ClassE"  table="TABLE_E">         <key column="B_ID" />         <property name="e1" column="E1" type="string" />         <property name="e2" column="E2" type="string" />         <property name="e3" column="E3" type="string" />         <property name="e4" column="E4" type="string" />         <property name="e5" column="E5" type="string" />         <property name="e6" column="E6" type="string" />      </joined-subclass >      <joined-subclass name="mypack.ClassF"  table="TABLE_F">         <key column="B_ID" />         <property name="f1" column="F1" type="string" />         <property name="f2" column="F2" type="string" />         <property name="f3" column="F3" type="string" />         <property name="f4" column="F4" type="string" />         <property name="f5" column="F5" type="string" />         <property name="f6" column="F6" type="string" />      </joined-subclass >      </class>      </hibernate-mapping>

在ClassA.hbm.xml文件中,在用于映射ClassD的元素中還嵌入了兩個元素,它們分別映射ClassG和ClassH類。在以及所有的元素中都設(shè)置了discriminator-value屬性,Hibernate根據(jù)discriminator-value屬性來判斷TABLE_A表中的記錄對應(yīng)哪個類的實例,如果 TABLE_A表的一條記錄的A_TYPE字段取值為"A",表明它是ClassA類的實例,如果A_TYPE字段取值為"G",表明它是ClassG類的實例,依次類推。

值得注意的是,在元素中只能嵌入子元素,但不能嵌入子元素,而在元素中只能嵌入子元素,但不能嵌入< subclass>子元素。

本節(jié)的范例程序位于配套光盤的sourcecode/chapter14/14.4目錄下,運行該程序前,需要在SAMPLEDB數(shù)據(jù)庫中手工創(chuàng)建TABLE_A表、TABLE_B表、TABLE_E表和TABLE_F表,相關(guān)的SQL腳本文件為/14.4/schema/sampledb.sql。

在DOS命令行下進(jìn)入chapter14根目錄,然后輸入命令:

ant  -file  build4.xml  run


就會運行BusinessService類。BusinessService的main()方法調(diào)用test()方法,test()方法調(diào)用saveDO(DOClass Object)方法,它負(fù)責(zé)保存一個DOClass對象,saveDO()方法的代碼如下:

tx = session.beginTransaction();session.save(object);tx.commit();


在test()方法中,創(chuàng)建了一個ClassG類的實例和一個ClassF類的實例,然后調(diào)用saveDO()方法分別保存這兩個實例:

ClassG g=new ClassG("a1","d1","g1");saveDO(g); ClassF f=new ClassF("b1","f1","f2","f3","f4","f5","f6","f7");saveDO(f);


Session的save()方法能判斷object變量實際引用的實例的類型,如果object變量引用ClassG類的實例,就執(zhí)行如下insert語句:


insert into TABLE_A (ID,A1,D1,G1,A_TYPE) values (1, 'a1', 'd1', 'g1','G');


如果object變量引用ClassF類的實例,就執(zhí)行如下insert語句:

insert into TABLE_B (ID,B1) values (1, 'b1');insert into TABLE_F (B_ID ,F1, F2, F3, F4, F5, F6) values (1, 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7');

(出處:http://m.survivalescaperooms.com)



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 延边| 广安市| 合山市| 灌阳县| 卫辉市| 建始县| 墨玉县| 宁国市| 澄城县| 保亭| 绥芬河市| 太谷县| 池州市| 玉门市| 普安县| 栖霞市| 孝义市| 红原县| 杭锦后旗| 金昌市| 安达市| 错那县| 都昌县| 望谟县| 沐川县| 黑水县| 广元市| 奇台县| 陵水| 田东县| 章丘市| 绥芬河市| 五台县| 沙坪坝区| 鹤山市| 汽车| 宁武县| 华亭县| 枣阳市| 新干县| 漯河市|