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

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

精通Hibernate之映射繼承關系六

2019-11-18 12:57:10
字體:
來源:轉載
供稿:網友

  在這種映射方式下,繼續關系樹的每個類以及接口都對應一個表。在本例中,需要創建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對象。
  
 ?。?)運行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對象。
  
 ?。?)運行findAllEmployees()方法,它的代碼如下:
  
  tx = session.beginTransaction();
  List results=session.find("from Employee");
  tx.commit();
  return results;
  在運行Session的find()方法時,Hibernate執行以下select語句:
  select * from EMPLOYEES e
  left outer join HOURLY_EMPLOYEES he on e.ID=he.EMPLOYEE_ID
  left 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集合。
  
 ?。?)運行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表的記錄共享同一個主鍵。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线私人| 久久久精品日本| 久青草国产97香蕉在线视频| 亚洲欧美日韩直播| 国产精品久久一| 国产精品99免视看9| 精品久久久一区二区| 岛国av一区二区| 亚洲免费电影一区| 久久精品成人欧美大片古装| 欧美性xxxx极品hd满灌| 欧美视频专区一二在线观看| 亚洲精品电影在线| 亚洲精品国产精品乱码不99按摩| 欧美日韩国产激情| 91网站免费看| 国产91精品最新在线播放| 国产成人精品免高潮在线观看| 日韩一区二区精品视频| 亚洲奶大毛多的老太婆| 有码中文亚洲精品| 亚洲激情第一页| 亚洲xxxx在线| 亚洲国产高清福利视频| 国产精品igao视频| 日韩精品在线免费播放| 欧美另类精品xxxx孕妇| 国产精品女视频| 91天堂在线观看| 欧美日韩999| 亚洲一区二区久久久| 日韩欧美在线国产| 亚洲精品自拍第一页| 精品欧美激情精品一区| 亚洲综合最新在线| 久久久极品av| 久久99国产综合精品女同| 日韩在线欧美在线国产在线| 97视频在线观看免费| 久久久久中文字幕2018| 亚洲国产欧美一区二区丝袜黑人| 精品久久在线播放| 精品久久久久久久中文字幕| 欧美成人黄色小视频| 91日本在线观看| 色妞久久福利网| 日韩av免费在线播放| 欧美日韩一区二区三区在线免费观看| 在线播放国产一区二区三区| 黑人巨大精品欧美一区二区| 中文亚洲视频在线| 亚洲国产欧美在线成人app| 92看片淫黄大片欧美看国产片| 久久人人爽人人爽人人片亚洲| 成人在线视频网站| 日韩在线视频线视频免费网站| 热99在线视频| 亚洲精品中文字幕女同| 日韩中文字在线| 日韩精品一区二区三区第95| 久久精品国产亚洲一区二区| 在线播放日韩专区| 最近2019年好看中文字幕视频| 国产女人18毛片水18精品| 国产亚洲精品日韩| 91亚洲精品视频| 久久五月天综合| 亚洲自拍偷拍视频| 亚洲乱码国产乱码精品精| 国产精品一区二区三区毛片淫片| 国产一区二区三区视频| 欧美日韩中文字幕在线| 亚洲电影中文字幕| 成人黄色大片在线免费观看| 久久久免费精品视频| 日韩欧美精品中文字幕| 久久天天躁夜夜躁狠狠躁2022| 国产精品激情av在线播放| 成人在线视频网站| 欧洲午夜精品久久久| 国产精品男女猛烈高潮激情| 日韩中文字幕在线| 国产精品一区二区久久| 浅井舞香一区二区| 亚洲黄色免费三级| 久久久久久免费精品| 中文字幕久热精品视频在线| 日韩av网站在线| 国产精品成人va在线观看| 国产精品久久久久91| 欧美性猛交99久久久久99按摩| 国产精自产拍久久久久久| 97欧美精品一区二区三区| 国产成人精品国内自产拍免费看| 欧美日韩中文字幕日韩欧美| 色偷偷噜噜噜亚洲男人的天堂| 久久久国产精品免费| 亚洲男人第一网站| 欧美在线观看网站| 蜜月aⅴ免费一区二区三区| 自拍偷拍亚洲欧美| 国产原创欧美精品| 精品久久久久久久中文字幕| 国产一区视频在线播放| 国产亚洲视频在线观看| 日韩电影中文字幕一区| 国产精品中文久久久久久久| 韩日精品中文字幕| 播播国产欧美激情| 国产国产精品人在线视| 欧美日韩国产成人在线| 欧洲s码亚洲m码精品一区| 国产精品视频内| 亚洲最大av网站| 9.1国产丝袜在线观看| 国产婷婷97碰碰久久人人蜜臀| 中文字幕免费精品一区| 亚洲自拍偷拍在线| 97人洗澡人人免费公开视频碰碰碰| 日韩av在线一区二区| 亚洲国产精品电影在线观看| 欧美电影免费观看高清| 久久久国产一区二区三区| 日韩在线欧美在线国产在线| 国产亚洲人成a一在线v站| 亚洲天堂视频在线观看| 97视频网站入口| 国产精品久久电影观看| 欧美丰满少妇xxxxx做受| 亚洲午夜未满十八勿入免费观看全集| 国产99久久久欧美黑人| 精品成人久久av| 久久精品成人欧美大片| 国产不卡精品视男人的天堂| 久久影视免费观看| 中文字幕日韩在线播放| 亚洲欧美成人网| 亚洲欧美国产精品| 欧美日韩性生活视频| 国内揄拍国内精品少妇国语| 久久久国产精品免费| 精品久久香蕉国产线看观看gif| 国产精品高潮视频| 少妇高潮 亚洲精品| 国产一区欧美二区三区| 亚洲日韩第一页| 亚洲国产成人久久综合| 在线视频日本亚洲性| 精品欧美激情精品一区| 国产噜噜噜噜噜久久久久久久久| 亚洲女人天堂成人av在线| 亚洲视频电影图片偷拍一区| 成人h视频在线| 一本一本久久a久久精品综合小说| 欧美黄网免费在线观看| 黄色一区二区在线| 亚洲男人的天堂在线播放| 国产精品18久久久久久麻辣| 国产亚洲欧美视频| 亚洲品质视频自拍网| 亚洲一区二区三区四区在线播放| 国产欧美日韩丝袜精品一区| 久久亚洲成人精品| 亚洲精选在线观看|