伸进女同桌乳沟里摸爽了,小雪解开乳罩给老杨摸,少妇被按摩师摸高潮了,亲嘴扒胸摸屁股激烈视频,强摸秘书人妻大乳BD,摸BBB揉BBB揉BBB视频

新疆軟件開(kāi)發(fā)

本站首頁(yè) 軟件開(kāi)發(fā) 成功案例 公司新聞 公司簡(jiǎn)介 客服中心 軟件技術(shù) 網(wǎng)站建設(shè)
  您現(xiàn)在的位置: 新疆二域軟件開(kāi)發(fā)公司 >> 開(kāi)發(fā)語(yǔ)言 >> 文章正文

Hibernate之映射繼承關(guān)系的基礎(chǔ)學(xué)習(xí)

  如圖14-6所示,EMPLOYEES表僅包含和Employee類的屬性對(duì)應(yīng)的字段,HE表僅包含和HourlyEmployee類的屬性對(duì)應(yīng)的字段,SE表僅包含和SalariedEmployee類的屬性對(duì)應(yīng)的字段。此外,HE表和SE表都以EMPLOYEE_ID字段作為主鍵,該字段還同時(shí)作為外鍵參照EMPLOYEES表。
  圖14-6 繼承關(guān)系樹(shù)的每個(gè)類對(duì)應(yīng)一個(gè)表
  圖14-7 持久化類、映射文件和數(shù)據(jù)庫(kù)表之間的對(duì)應(yīng)關(guān)系14.3.1 創(chuàng)建映射文件
  從Company類到Employee類是多態(tài)關(guān)聯(lián),由于關(guān)系數(shù)據(jù)模型描述了Employee類和它的兩個(gè)子類的繼承關(guān)系,因此可以映射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表,在這個(gè)映射文件中,除了需要映射Employee類本身的屬性,還需要在 元素中映射兩個(gè)子類的屬性。例程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文件中,兩個(gè)元素用于映射HourlyEmployee類和SalariedEmployee類,元素的子元素指定HE表和SE表中既作為主鍵又作為外鍵的EMPLOYEE_ID字段。

  由于HourlyEmployee類和SalariedEmployee類沒(méi)有單獨(dú)的映射文件,因此在初始化Hibernate時(shí),只需向Configuration對(duì)象中加入Company類和Employee類:

  Configuration config = new Configuration();

  config.addClass(Company.class)

  。addClass(Employee.class);

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

name="mypack.HourlyEmployee"table="HOURLY_EMPLOYEES" extends="mypack.Employee" >……
 
  由于HourlyEmployee類的映射代碼不位于Employee.hbm.xml文件中,因此在初始化Hibernate時(shí),不僅需要向Configuration對(duì)象中加入Company類和Employee類,還需要加入HourlyEmployee類,并且必須先加入Employee父類,再加入HourlyEmployee子類:

  Configuration config = new Configuration();

  config.addClass(Company.class)

  。addClass(Employee.class)

  。addClass(HourlyEmployee.class);

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

  14.3.2 操縱持久化對(duì)象

  這種映射方式支持多態(tài)查詢,對(duì)于以下查詢語(yǔ)句:

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

  Hibernate會(huì)檢索出所有的HourlyEmployee對(duì)象和SalariedEmployee對(duì)象。此外,也可以單獨(dú)查詢Employee類的兩個(gè)子類的實(shí)例,例如:

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

  本節(jié)的范例程序位于配套光盤的sourcecode\chapter14\14.3目錄下,運(yùn)行該程序前,需要在SAMPLEDB數(shù)據(jù)庫(kù)中手工創(chuàng)建COMPANIES表、EMPLOYEES表、HE表和SE表,然后加入測(cè)試數(shù)據(jù),相關(guān)的SQL腳本文件為\14.3\schema\sampledb.sql.

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

  ant  -file  build3.xml  run

  就會(huì)運(yùn)行BusinessService類。BusinessService的main()方法調(diào)用test()方法,test()方法依次調(diào)用以下方法:

  findAllHourlyEmployees():檢索數(shù)據(jù)庫(kù)中所有的HourlyEmployee對(duì)象。

  findAllEmployees():檢索數(shù)據(jù)庫(kù)中所有的Employee對(duì)象。

  loadCompany():加載一個(gè)Company對(duì)象。

  saveEmployee():保存一個(gè)Employee對(duì)象。

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

  tx = session.beginTransaction();

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

  tx.commit();

  return results;

  在運(yùn)行Session的find()方法時(shí),Hibernate執(zhí)行以下select語(yǔ)句:

  select * from HOURLY_EMPLOYEES he inner join EMPLOYEES e

  on he.EMPLOYEE_ID=e.ID;

  select * from COMPANIES where ID=1;

  Hibernate通過(guò)HE表與EMPLOYEES表的內(nèi)連接獲得HourlyEmployee對(duì)象的所有屬性值,此外,在加載HourlyEmployee對(duì)象時(shí),還會(huì)同時(shí)加載與它關(guān)聯(lián)的Company對(duì)象。

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

  tx = session.beginTransaction();

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

  tx.commit();

  return results;

  在運(yùn)行Session的find()方法時(shí),Hibernate執(zhí)行以下select語(yǔ)句:

  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表進(jìn)行左外連接,從而獲得HourlyEmployee對(duì)象和SalariedEmployee對(duì)象的所有屬性值。在這種映射方式下,Hibernate支持多態(tài)查詢,對(duì)于以上查詢語(yǔ)句獲得的查詢結(jié)果,如果HE表的EMPLOYEE_ID字段不為null,就創(chuàng)建HoulyEmployee實(shí)例,如果SE表的EMPLOYEE_ID字段不為null,就創(chuàng)建SalariedEmployee實(shí)例,這些實(shí)例所關(guān)聯(lián)的Company對(duì)象也被加載。

  (3)運(yùn)行l(wèi)oadCompany()方法,它的代碼如下:

  tx = session.beginTransaction();

  Company company=(Company)session.load(Company.class,new Long(id));

  Hibernate.initialize(company.getEmployees());

  tx.commit();

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

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

  tx = session.beginTransaction();

  session.save(employee);

  tx.commit();

  在test()方法中,創(chuàng)建了一個(gè)HourlyEmployee實(shí)例,然后調(diào)用saveEmployee()方法保存這個(gè)實(shí)例:

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

  saveEmployee(employee);

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

  insert into EMPLOYEES (ID,NAME, COMPANY_ID) values (5, 'Mary', 1);

  insert into HOURLY_EMPLOYEES (EMPLOYEE_ID ,RATE) values (5, 300);

  可見(jiàn),每保存一個(gè)HourlyEmployee對(duì)象,需要分別向EMPLOYEES表和HE表插入一條記錄,EMPLOYEES表的記錄和HE表的記錄共享同一個(gè)主鍵。

作者:未知 | 文章來(lái)源:未知 | 更新時(shí)間:2008-1-15 16:39:19

  • 上一篇文章:

  • 下一篇文章:

  • 相關(guān)文章:
    學(xué)習(xí)Hibernate+Mssql server數(shù)據(jù)的操作
    軟件技術(shù)
    · 開(kāi)發(fā)語(yǔ)言
    · Java技術(shù)
    · .Net技術(shù)
    · 數(shù)據(jù)庫(kù)開(kāi)發(fā)
    最新文章  
    ·搜集整理的asp.net的驗(yàn)證方
    ·各種FOR循環(huán)結(jié)構(gòu)的整理
    ·軟件項(xiàng)目開(kāi)發(fā)中應(yīng)該考慮那
    ·搜集整理的javascript sel
    ·軟件開(kāi)發(fā)中項(xiàng)目經(jīng)理有那些
    ·學(xué)習(xí)如何在Lambda表達(dá)式進(jìn)
    ·C++基礎(chǔ)知識(shí):結(jié)構(gòu)體數(shù)據(jù)的
    ·C#實(shí)現(xiàn)短信發(fā)送程序的例子
    ·sun最近修補(bǔ)了一部分java的
    ·rss定制的另外一種實(shí)現(xiàn)方式
    ·delphi實(shí)現(xiàn)利用arp欺騙來(lái)實(shí)
    ·基礎(chǔ)學(xué)習(xí):基于WF的流程框
    ·網(wǎng)絡(luò)編程中怎樣得知一次數(shù)
    ·如何逆序輸出單鏈表?
    ·軟件開(kāi)發(fā)過(guò)程中的性能設(shè)計(jì)
    關(guān)于我們 | 軟件開(kāi)發(fā) | 下載試用 | 客服中心 | 聯(lián)系我們 | 友情鏈接 | 網(wǎng)站地圖 | 新疆電子地圖 | RSS訂閱
    版權(quán)所有 © 2016 新疆二域軟件開(kāi)發(fā)網(wǎng) www.zgna.net All Rights Reserved 新ICP備14003571號(hào)
    新疆軟件開(kāi)發(fā)總機(jī):0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆烏魯木齊北京中路華聯(lián)大廈A-5C 郵編:830000
     
    永德县| 绿春县| 张家界市| 双桥区| 南丰县| 福清市| 越西县| 喀喇| 无极县| 开封县| 贞丰县| 桑植县| 乌拉特前旗| 台州市| 绵阳市| 竹溪县| 白城市| 安多县| 奉新县| 教育| 海安县| 中宁县| 武乡县| 大丰市| 福州市| 都昌县| 明水县| 金山区| 苗栗市| 平塘县| 洪江市| 偏关县| 铜梁县| 永城市| 湘乡市| 拉萨市| 阳高县| 秦安县| 定南县| 清丰县| 延边|