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

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

精通Hibernate映射繼承關系之四

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

  在這種映射方式下,繼承關系樹的每個類以及接口都對應一個表。在本例中,需要創建EMPLOYEES、HE和SE表。

如圖14-6所示,EMPLOYEES表僅包含和Employee類的屬性對應的字段,HE表僅包含和HourlyEmployee類的屬性對應的字段,SE表僅包含和SalariedEmployee類的屬性對應的字段。此外,HE表和SE表都以EMPLOYEE_ID字段作為主鍵,該字段還同時作為外鍵參照EMPLOYEES表。

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


圖14-6 繼承關系樹的每個類對應一個表


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


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

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

例程14-7 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-8是Employee.hbm.xml文件的代碼。

例程14-8 Employee.hbm.xml

<hibernate-mapping >      <class name="mypack.Employee" table="EMPLOYEES">      <id name="id" type="long" column="ID">      <generator class="increment"/>      </id>      <property name="name" type="string" column="NAME" />      <many-to-one        name="company"        column="COMPANY_ID"        class="mypack.Company"      />      <joined-subclass name="mypack.HourlyEmployee" table="HOURLY_EMPLOYEES" >      <key column="EMPLOYEE_ID" />      <property name="rate" column="RATE" type="double" />      </joined-subclass>      <joined-subclass name="mypack.SalariedEmployee"  table="SALARIED_EMPLOYEES" >      <key column="EMPLOYEE_ID" />      <property name="salary" column="SALARY" type="double" />      </joined-subclass>           </class>      </hibernate-mapping>


在Employee.hbm.xml文件中,兩個元素用于映射HourlyEmployee類和SalariedEmployee類,元素的子元素指定HE表和SE表中既作為主鍵又作為外鍵的EMPLOYEE_ID字段。

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


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


也可以在單獨的映射文件中配置元素,但此時必須顯式設定它們的extends屬性。例如可以在單獨的HourlyEmployee.hbm.xml文件中映射HourlyEmployee類:

<hibernate-mapping ><joined-subclass name="mypack.HourlyEmployee"table="HOURLY_EMPLOYEES" extends="mypack.Employee" >……	</joined-class><hibernate-mapping >


由于HourlyEmployee類的映射代碼不位于Employee.hbm.xml文件中,因此在初始化Hibernate時,不僅需要向Configuration對象中加入Company類和Employee類,還需要加入HourlyEmployee類,并且必須先加入Employee父類,再加入HourlyEmployee子類:

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


如果顛倒加入Employee類和HourlyEmployee子類的順序,Hibernate在執行addClass()方法時會拋出HibernateMappingException。

14.3.2 操縱持久化對象
這種映射方式支持多態查詢,對于以下查詢語句:
 

List employees=session.find("from Employee");
 
 
Hibernate會檢索出所有的HourlyEmployee對象和SalariedEmployee對象。此外,也可以單獨查詢Employee類的兩個子類的實例,例如:

List hourlyEmployees=session.find("from HourlyEmployee");


本節的范例程序位于配套光盤的sourcecode/chapter14/14.3目錄下,運行該程序前,需要在SAMPLEDB數據庫中手工創建COMPANIES表、EMPLOYEES表、HE表和SE表,然后加入測試數據,相關的SQL腳本文件為/14.3/schema/sampledb.sql。

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

ant  -file  build3.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 HOURLY_EMPLOYEES he inner join EMPLOYEES e on he.EMPLOYEE_ID=e.ID;select * from COMPANIES where ID=1;


Hibernate通過HE表與EMPLOYEES表的內連接獲得HourlyEmployee對象的所有屬性值,此外,在加載HourlyEmployee對象時,還會同時加載與它關聯的Company對象。

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


tx = session.beginTransaction();List results=session.find("from Employee");tx.commit();return results;在運行Session的find()方法時,Hibernate執行以下select語句:select * from EMPLOYEES eleft outer join HOURLY_EMPLOYEES he on e.ID=he.EMPLOYEE_IDleft outer join SALARIED_EMPLOYEES se on e.ID=se.EMPLOYEE_ID;select * from COMPANIES where ID=1;
Hibernate把EMPLOYEES表與HE表以及SE表進行左外連接,從而獲得HourlyEmployee對象和SalariedEmployee對象的所有屬性值。在這種映射方式下,Hibernate支持多態查詢,對于以上查詢語句獲得的查詢結果,如果HE表的EMPLOYEE_ID字段不為null,就創建HoulyEmployee實例,如果SE表的EMPLOYEE_ID字段不為null,就創建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, COMPANY_ID) values (5, 'Mary', 1);insert into HOURLY_EMPLOYEES (EMPLOYEE_ID ,RATE) values (5, 300);


可見,每保存一個HourlyEmployee對象,需要分別向EMPLOYEES表和HE表插入一條記錄,EMPLOYEES表的記錄和HE表的記錄共享同一個主鍵。

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



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美精品suv| 日韩精品视频在线| 亚洲乱码一区二区| 欧美大片在线免费观看| 91成人国产在线观看| 国产欧亚日韩视频| 91影视免费在线观看| 亚洲在线一区二区| 成人av资源在线播放| 亚洲视频axxx| 日韩不卡中文字幕| 久久久久亚洲精品| 亚洲欧美国产精品久久久久久久| 亚洲人成网7777777国产| 欧美极度另类性三渗透| 日韩欧美中文第一页| 91亚洲国产成人精品性色| 久久久免费观看| 欧美性猛交xxxx黑人| 久久成人精品一区二区三区| 国产精品视频资源| 亚洲国产另类 国产精品国产免费| 日本精品久久久久影院| 欧美日韩一区二区精品| 国产男女猛烈无遮挡91| 欧美www视频在线观看| 欧美精品手机在线| 日韩成人av网址| 色噜噜狠狠色综合网图区| 91日本在线观看| 精品国产一区二区三区四区在线观看| 久久人体大胆视频| 欧洲成人在线视频| 成人性生交大片免费看视频直播| 国产精品黄色影片导航在线观看| 久久精品久久精品亚洲人| 欧美成人网在线| 在线亚洲欧美视频| 色与欲影视天天看综合网| 欧美自拍大量在线观看| 日韩欧美亚洲成人| 久久久久久成人| 欧美在线视频免费播放| 成人性生交大片免费观看嘿嘿视频| 国产精品盗摄久久久| 国产91成人在在线播放| 亚洲精品v天堂中文字幕| 91精品视频专区| 欧美一区二粉嫩精品国产一线天| 日韩欧美精品网站| 成人黄色午夜影院| 亚洲欧美国产制服动漫| www.亚洲一二| 一区二区日韩精品| 久久久久99精品久久久久| 这里只有精品丝袜| 国产性猛交xxxx免费看久久| 欧美黑人性猛交| 欧美孕妇孕交黑巨大网站| 亚洲国产精品va在看黑人| 在线视频国产日韩| 亚洲国产高清自拍| 91九色蝌蚪国产| 日韩在线视频免费观看高清中文| 欧美激情二区三区| 欧美日韩中文字幕在线| 麻豆乱码国产一区二区三区| 日韩国产精品亚洲а∨天堂免| 伊人久久五月天| 亚洲国产精品成人av| 在线成人激情视频| 久久久久久久久电影| 欧美一级视频在线观看| 亚洲人成网站777色婷婷| 国产精品日韩在线一区| 岛国精品视频在线播放| 色爱av美腿丝袜综合粉嫩av| 亚洲综合在线播放| 欧美裸体xxxx极品少妇| 性色av一区二区三区| 国产精品美女无圣光视频| 精品久久久久久久久久久久| 久久久久久亚洲精品中文字幕| 国产一区二区视频在线观看| 欧美激情亚洲综合一区| 国产精品视频久久| 最近2019中文字幕mv免费看| 亚洲免费成人av电影| 国产成人一区二区三区电影| 国产成人精品电影| 国产欧美韩国高清| 久久九九免费视频| 国产精品扒开腿做| 国产91色在线|| 日韩欧美福利视频| 国产精品jizz在线观看麻豆| 久久久久国产一区二区三区| 欧美风情在线观看| 一区二区成人精品| 国产精品女主播视频| 久久中国妇女中文字幕| 国产一区二区香蕉| 91在线免费网站| 中文字幕自拍vr一区二区三区| 欧美日韩性视频在线| 国产精品久久久久一区二区| 少妇高潮久久久久久潘金莲| 色妞一区二区三区| 亚洲一区亚洲二区亚洲三区| 伊人久久久久久久久久| 81精品国产乱码久久久久久| 欧美亚洲在线播放| 国产成人拍精品视频午夜网站| 欧美电影在线播放| 亚洲黄色成人网| 欧美性猛交xxxx免费看漫画| 欧美激情亚洲自拍| 国产亚洲成av人片在线观看桃| 成人高h视频在线| 欧美日韩日本国产| 久久精品99久久久香蕉| 97国产精品视频人人做人人爱| 日韩中文字幕亚洲| 亚洲欧美精品在线| 国产91热爆ts人妖在线| 亚洲四色影视在线观看| 91精品国产自产在线观看永久| 亚洲男人天堂2019| 欧美成人中文字幕在线| 欧美精品18videosex性欧美| 欧美精品www在线观看| 日韩在线观看av| 亚洲精品98久久久久久中文字幕| 亚洲美女av在线| 久久亚洲私人国产精品va| 日韩一区二区欧美| 久久国产精品网站| 国产精品视频网址| 欧美成年人网站| 亚洲成人三级在线| 狠狠躁夜夜躁人人爽超碰91| 欧美日韩国产精品一区二区不卡中文| 国产精品一区二区久久精品| 国产日韩欧美视频在线| 欧美成人合集magnet| 黑人巨大精品欧美一区二区三区| 欧美视频一区二区三区…| 亚洲男人第一av网站| 最近2019免费中文字幕视频三| 国产精选久久久久久| 亚洲女人天堂网| 亚洲一区二区三区sesese| 精品国产91久久久久久| 久久影视三级福利片| 亚洲第一免费播放区| 久久精品视频导航| 欧美视频专区一二在线观看| 在线精品国产欧美| 亚洲一区二区三区毛片| 美女黄色丝袜一区| 亚洲日本成人女熟在线观看| 欧美一级淫片videoshd| 国产亚洲一区二区在线| 欧美亚洲激情在线|