亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

精通Hibernate映射繼承關系之三

2019-11-18 16:11:50
字體:
來源:轉載
供稿:網友

  這種映射方式只需為繼承關系樹的Employee根類創建一張表EMPLOYEES。如圖14-4所示,在EMPLOYEES表中不僅提供和Employee類的屬性對應的字段,還要提供和它的兩個子類的所有屬型對應的字段,此外,EMPLOYEES表中需要額外加入一個字符串類型的EMPLOYEE_TYPE字段,用于區分Employee的具體類型。


精通Hibernate映射繼承關系之三(圖一)
圖14-4 繼承關系樹的根類對應一個表


Company類和Employee類有相應的映射文件,而HourlyEmployee類和SalariedEmployee類沒有相應的映射文件。圖14-5顯示了持久化類、映射文件和數據庫表之間的對應關系。

精通Hibernate映射繼承關系之三(圖二)


圖14-5 持久化類、映射文件和數據庫表之間的對應關系


14.2.1 創建映射文件

從Company類到Employee類是多態關聯,由于關系數據模型描述了Employee類和它的兩個子類的繼承關系,因此可以映射Company類的employees集合。例程14-5是Company.hbm.xml文件的代碼,該文件不僅映射了Company類的id和name屬性,還映射了它的employees集合。

例程14-5 Company.hbm.xml

<hibernate-mapping ><class name="mypack.Company" table="COMPANIES" ><id name="id" type="long" column="ID"><generator class="increment"/></id><PRoperty name="name" type="string"  column="NAME" /><set name="employees"inverse="true"lazy="true" ><key column="COMPANY_ID" /><one-to-many class="mypack.Employee" /></set>   </class></hibernate-mapping>

Employee.hbm.xml文件用于把Employee類映射到EMPLOYEES表,在這個映射文件中,除了需要映射Employee類本身的屬性,還需要在元素中映射兩個子類的屬性。例程14-6是Employee.hbm.xml文件的代碼。

例程14-6 Employee.hbm.xml



<hibernate-mapping >      <class name="mypack.Employee" table="EMPLOYEES">      <id name="id" type="long" column="ID">        <generator class="increment"/>      </id>      <discriminator column="EMPLOYEE_TYPE" type="string"  />        <property name="name" type="string" column="NAME" />      <many-to-one        name="company"        column="COMPANY_ID"        class="mypack.Company"      />      <subclass name="mypack.HourlyEmployee" discriminator-value="HE" >         <property name="rate" column="RATE" type="double" />      </subclass>      <subclass name="mypack.SalariedEmployee" discriminator-value="SE" >         <property name="salary" column="SALARY" type="double" />      </subclass>           </class>       </hibernate-mapping>           


在Employee.hbm.xml文件中,元素指定EMPLOYEES表中用于區分Employee類型的字段為EMPLOYEE_TYPE,兩個元素用于映射HourlyEmployee類和SalariedEmployee類,元素的discriminator-value屬性指定EMPLOYEE_TYPE字段的取值。EMPLOYEES表中有以下記錄:


精通Hibernate映射繼承關系之三(圖三)


其中ID為1和2的記錄的EMPLOYEE_TYPE字段的取值為"HE",因此它們對應HourlyEmployee類的實例,其中ID為3和4的記錄的EMPLOYEE_TYPE字段的取值為"SE",因此它們對應SalariedEmployee類的實例。

這種映射方式要求EMPLOYEES表中和子類屬性對應的字段允許為null,例如ID為1和2的記錄的SALARY字段為null,而ID為3和4的記錄的RATE字段為null。如果業務需求規定SalariedEmployee對象的rate屬性不允許為null,顯然無法在EMPLOYEES表中為SALARY字段定義not null約束,可見這種映射方式無法保證關系數據模型的數據完整性。

由于HourlyEmployee類和SalariedEmployee類沒有單獨的映射文件,因此在初始化Hibernate時,只需向Configuration對象中加入Company類和Employee類:

Configuration config = new Configuration();config.addClass(Company.class).addClass(Employee.class);


如果Employee類不是抽象類,即它本身也能被實例化,那么可以在元素中定義它的discriminator值,形式如下:

<class name="mypack.Employee" table="EMPLOYEES" discriminator-value="EE">


以上代碼表明,如果EMPLOYEES表中一條記錄的EMPLOYEE_TYPE字段的取值為"EE",那么它對應Employee類本身的實例。

14.2.2 操縱持久化對象

這種映射方式支持多態查詢,對于以下查詢語句:

List employees=session.find("from Employee");


Hibernate會檢索出所有的HourlyEmployee對象和SalariedEmployee對象。此外,也可以單獨查詢Employee類的兩個子類的實例,例如:

List hourlyEmployees=session.find("from HourlyEmployee");
本節的范例程序位于配套光盤的sourcecode/chapter14/14.2目錄下,運行該程序前,需要在SAMPLEDB數據庫中手工創建COMPANIES表和EMPLOYEES表,然后加入測試數據,相關的SQL腳本文件為/14.2/schema/sampledb.sql。

在DOS命令行下進入chapter14根目錄,然后輸入命令:


ant  -file  build2.xml  run


就會運行BusinessService類。BusinessService的main()方法調用test()方法,test()方法依次調用以下方法:

findAllHourlyEmployees():檢索數據庫中所有的HourlyEmployee對象。 	findAllEmployees():檢索數據庫中所有的Employee對象。 	loadCompany():加載一個Company對象。 	saveEmployee():保存一個Employee對象。


(1)運行findAllHourlyEmployees()方法,它的代碼如下:

tx = session.beginTransaction();List results=session.find("from HourlyEmployee");tx.commit();return results;在運行Session的find()方法時,Hibernate執行以下select語句:select * from EMPLOYEES where EMPLOYEE_TYPE='HE' ;select * from COMPANIES where ID=1;


在加載HourlyEmployee對象時,還會同時加載與它關聯的Company對象。

(2)運行findAllEmployees()方法,它的代碼如下:

tx = session.beginTransaction();List results=session.find("from Employee");tx.commit();return results;在運行Session的find()方法時,Hibernate執行以下select語句:
select * from EMPLOYEES;select * from COMPANIES where ID=1;


在這種映射方式下,Hibernate支持多態查詢,對于從EMPLOYEES表獲得的查詢結果,如果EMPLOYEE_TYPE字段取值為"HE",就創建HoulyEmployee實例,如果EMPLOYEE_TYPE字段取值為"SE",就創建SalariedEmployee實例,這些實例所關聯的Company對象也被加載。

(3)運行loadCompany()方法,它的代碼如下:

tx = session.beginTransaction();Company company=(Company)session.load(Company.class,new Long(id));Hibernate.initialize(company.getEmployees());tx.commit();

這種映射方式支持多態關聯。如果在Company.hbm.xml文件中對employees集合設置了立即檢索策略,那么Session的load()方法加載的Company對象的employees集合中包含所有關聯的Employee對象。由于本書提供的Company.hbm.xml文件對employees集合設置了延遲檢索策略,因此以上程序代碼還通過Hibernate類的靜態initialize()方法來顯式初始化employees集合。

(4)運行saveEmployee(Employee employee)方法,它的代碼如下:



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


在test()方法中,創建了一個HourlyEmployee實例,然后調用saveEmployee()方法保存這個實例:

Employee employee=new HourlyEmployee("Mary",300,company);saveEmployee(employee);


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

insert into EMPLOYEES(ID,NAME,RATE,EMPLOYEE_TYPE,CUSTOMER_ID)values(5, 'Mary ',300, 'HE',1);


以上insert語句沒有為SalariedEmployee類的salary屬性對應的SALARY字段賦值,因此這條記錄的SALARY字段為null。

(出處:http://www.49028c.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久av| 日韩精品视频在线播放| 国外成人在线播放| 欧美大码xxxx| 亚洲www在线| 日韩中文字幕在线免费观看| 一本一本久久a久久精品综合小说| 精品国产欧美一区二区三区成人| 国产成人精品免高潮在线观看| 国产在线观看精品一区二区三区| 亚洲图中文字幕| 成人性生交大片免费观看嘿嘿视频| 精品视频9999| 国产美女主播一区| 国产精品免费网站| 91九色在线视频| 久久久久久久一| 亚洲男人的天堂网站| 欧美孕妇毛茸茸xxxx| 欧美激情三级免费| 中国日韩欧美久久久久久久久| 国产欧美一区二区三区久久| 国产精品pans私拍| 亚洲一区二区三区成人在线视频精品| 国模极品一区二区三区| 国产精品久久久久久久久久三级| 国产综合视频在线观看| 91亚洲精华国产精华| 午夜精品福利在线观看| 精品无码久久久久久国产| 91探花福利精品国产自产在线| 色综合久久中文字幕综合网小说| 国产精品一区久久久| 欧美精品video| 久久精品视频亚洲| 亚洲精品wwwww| 亚洲国产一区二区三区在线观看| 夜夜狂射影院欧美极品| 北条麻妃99精品青青久久| 中文字幕亚洲国产| 综合136福利视频在线| 精品久久久久久久大神国产| 国产专区精品视频| 国产午夜精品一区二区三区| 欧美日韩国产精品一区| 欧美日韩在线另类| 91精品国产91久久久久久久久| 国产日本欧美视频| 亚洲人永久免费| 日韩福利视频在线观看| 亚洲人高潮女人毛茸茸| 欧美在线一级视频| 国产日韩在线精品av| 激情成人在线视频| 国内自拍欧美激情| 狠狠躁18三区二区一区| 日韩精品视频免费专区在线播放| 亚洲一二三在线| 原创国产精品91| 日韩中文字幕视频在线观看| 亚洲欧美日韩中文在线制服| 日韩免费在线免费观看| 日韩高清电影免费观看完整版| 久久久久久国产精品三级玉女聊斋| 国产一区二区三区视频在线观看| 亚洲一区二区三| 精品日本美女福利在线观看| 伊人久久男人天堂| 4444欧美成人kkkk| 亚洲一区二区三区在线免费观看| 亚洲国产日韩一区| 亚洲人成网在线播放| 精品美女国产在线| 久久精品国产一区二区电影| 亚洲欧美一区二区三区四区| 国产精品久久久久免费a∨| 国a精品视频大全| 国产日产欧美精品| 久久99精品久久久久久琪琪| 精品视频在线播放免| 97色在线视频观看| 久久久精品久久久久| 成人欧美一区二区三区在线湿哒哒| 欧美日韩免费看| 国产精品一区久久久| 美女扒开尿口让男人操亚洲视频网站| 欧美视频在线视频| 国产精品嫩草影院久久久| 亚洲欧美精品一区| 色哟哟亚洲精品一区二区| 日韩中文字幕第一页| 精品福利一区二区| 91久久在线观看| 久久久久久久久国产| 国产精品久久久久久av福利| 久久精品中文字幕免费mv| 国产精品视频白浆免费视频| 国产精品99久久久久久www| 欧美电影在线观看网站| 欧美亚洲一区在线| 精品一区精品二区| 亚洲图片欧美日产| 国产精品一区二区久久久久| 欧美日韩国产999| 国产日韩欧美夫妻视频在线观看| 91视频-88av| 久久影院免费观看| 成人在线视频网| 日韩在线视频免费观看高清中文| 亚洲精品乱码久久久久久金桔影视| 97人人模人人爽人人喊中文字| 欧美激情综合亚洲一二区| 亚洲春色另类小说| 亚洲免费伊人电影在线观看av| 91精品国产乱码久久久久久久久| 欧美日韩激情视频8区| 国产精品久久久久影院日本| 中文字幕久精品免费视频| 亚洲最新视频在线| 91久久国产精品91久久性色| 日韩电影视频免费| 亚洲男人天堂手机在线| 欧美老少配视频| 久久精品视频99| 91免费在线视频| 欧美黑人巨大精品一区二区| 中文字幕日韩欧美| 欧美性猛交xxxx黑人| 中文字幕最新精品| 2018中文字幕一区二区三区| 日韩成人xxxx| 国产欧美久久一区二区| 欧美激情一二区| 日本高清不卡在线| 91亚洲精品一区| 日本19禁啪啪免费观看www| 北条麻妃一区二区三区中文字幕| 欧美夫妻性生活xx| 91久久精品久久国产性色也91| 欧美老肥婆性猛交视频| 夜夜嗨av一区二区三区免费区| 久久男人的天堂| 蜜月aⅴ免费一区二区三区| 日韩电影免费观看在线观看| 这里只有精品在线播放| 日韩精品中文字幕久久臀| 日韩一级黄色av| 亚洲一区二区自拍| 亚洲免费视频一区二区| 91免费的视频在线播放| 91探花福利精品国产自产在线| 日韩欧美国产视频| 色爱精品视频一区| 国产精品久久久久久久久粉嫩av| 国产丝袜精品视频| 欧美黑人性视频| 精品国产精品三级精品av网址| 成人网中文字幕| 国产精品大陆在线观看| 中文字幕日韩在线播放| 色天天综合狠狠色| 精品视频9999| 欧美国产日韩视频| 91免费视频网站|