版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
14映射繼承關在域模型中,類與類之間除了關聯關系和聚集關系14映射繼承關在域模型中,類與類之間除了關聯關系和聚集關系,還可以存在繼承關系,在圖14-1的域模型中,CompanyEmployee類之間為一對多的雙向關聯關系(假定不允許雇員同,EmployeeEmployee類、HourlyEmployeeSalariedEmployee類構成了一顆繼承關系樹 14-1包含繼承關系的域模態(tài)是指當一個Java應用變量被聲明為Employee類時,這個變量實際上既可以引用現了多Listemployees=businessService.findAllEmployees();Iteratorit=employees.iterator();if(einstanceofSystem.out.println(e.getName()+"System.out.println(e.getName()+"}BusinessServicefindAllEmployees()方法通HibernateAPI從數據庫中檢索出所有含SalariedEmployee類的實例,這種查詢被稱為多態(tài)查詢。以上程序中變量e被聲明為Employee類型,它實際上既可能引用HourlyEmployee類的實例,也可能引用SalariedEmployee類的實例。類不是多態(tài)關聯,因Employeecompany屬性只會引Company類本身的實例。呢?本章將介紹以下三種映射方式salary:rate:name:Stringid:Longcompany:14-2所示,在關系數據模型中14-2所示,在關系數據模型中及從Employee類中繼承的id屬性和name屬性,在HE表中都有對應的字段。此外,義了參照COMPANIES表的COMPANY_ID外鍵。SalariedEmployee類和SE表對應,SalariedEmployee類本身的salary屬性,以及從Employee類中繼承的id屬性和name屬性,在SE表中都有對應的字段。此外,SalariedEmployeeEmployeeCompanySE表中14-2Company類、HourlyEmployee類和SalariedEmployee類都有相應的映射文件,而SALARIED_EMPLOYEESID<<PK>>COMPANYSHOURLY_EMPLOYEESID<<PK>>圖14- 如果Employee類不是抽象類,即Employee類本身也能被實例化,那么還需要為圖14- 如果Employee類不是抽象類,即Employee類本身也能被實例化,那么還需要為EMPLOYEES表、HESENAME字段以及參照COMPANIES表的外鍵COMPANY_ID。另外,還需為Employee類創(chuàng)建單獨的Employee.hbm.xml文件。14.1.1Company.hbm.xmlCompanyidname14-1<hibernate-mapping<idname="id"type="long"<generator<propertyname="name"type="string"column="NAME"</hibernate-HourlyEmployee.hbm.xmlHourlyEmployeeHE表,在這個映射文14-2<hibernate-mapping<idname="id"type="long"<generator<propertyname="name"type="string"column="NAME"<propertyname="rate"column="RATE"type="double"SALARIED_EMPLOYEESSalariedEmployeeCOMPANIESHOURLY_EMPLOYEESCompanyHourlyEmployee</hibernate-SalariedEmployee</hibernate-SalariedEmployeesalaryEmployee類中14-3<hibernate-mapping<classname="mypack.SalariedEmployee"<idname="id"type="long"<generator<propertyname="name"type="string"column="NAME"</hibernate-Configurationconfig=newConfiguration();Listemployees=session.find("fromEmployee類是抽象類,那Hibernate會拋出異常。如果Employee類是具體類,那HibernateEMPLOYEESEmployee類本身的實例,但不會檢索出它sourcecode/chapter14/14.1目錄下,運SAMPLEDBCOMPANIES表、HESE表,然后加入測試數據,相關的SQL腳本文件為/14.1/schema/sampledb.sql。<propertyname="source.root"<propertyname="class.root"<propertyname="lib.dir"<propertyname="source.root"<propertyname="class.root"<propertyname="lib.dir"<propertyname="schema.dir"ant-filebuild1.xml就會運行BusinessService類。ANT命令的-file選項用于顯式指定工程文件。14-4publicclasspublicstaticSessionFactorysessionFactory;Configurationconfig=newConfiguration();}catch(Exception}publicvoidsaveEmployee(Employeeemployee)throwsException{……}publicListfindAllEmployees()throwsException{……}publicCompanyloadCompany(longid)throwspublicvoidtest()throwsListemployees=findAllEmployees();}privatevoidprintAllEmployees(Iteratorit){while(it.hasNext()){Employeee=(Employee)it.next();if(einstanceof}}publicstaticvoidmain(Stringargs[])throws{newBusinessService().test();}}}}Listresults=newArrayList();return為了檢索所有的Employee對象,必須分別檢索所有的法時,Hibernate執(zhí)行以下select語句:select*fromHOURLY_EMPLOYEES;HourlyEmployee實例和Sessionfind()會同時加載與它關聯的Company對象。select*fromSalariedEmployee類到Company類不是多態(tài)關聯,在加載SalariedEmployee對象時,被加載到內存中,所以Hibernate不再需要執(zhí)行檢索該對象的select語句。tx=ListhourlyEmployees=session.find("fromHourlyEmployeehwhereListsalariedEmployees=session.find("fromSalariedEmployeeswherereturn它們加入到employees集合中。tx=session.beginTransaction();它們加入到employees集合中。tx=session.beginTransaction();HourlyEmployee實例,就向HE表插入一條記錄,執(zhí)行如下insert語句:insertintovalues(3,這種映射方式只需為繼承關系樹Employee根類創(chuàng)建一張EMPLOYEES。如圖14-4所子類的所有屬型對應的字段,此外,EMPLOYEES表中需要額外加入一個字符串類型的圖14- 圖14- SalariedEmployeeCOMPANIESCompanyHourlyEmployeeCOMPANYSID<<PK>> 的兩個子類的繼承關系,因此可以映射Company類的employees集合。例程 的兩個子類的繼承關系,因此可以映射Company類的employees集合。例程14-5employeesidname14-5<hibernate-mapping<idname="id"type="long"<generator<propertyname="name"type="string"column="NAME"lazy="true"></hibernate-Employee.hbm.xmlEmployeeEMPLOYEES表,在這個映射文件14-6<hibernate-mapping<idname="id"type="long"<generator<discriminatorcolumn="EMPLOYEE_TYPE" <propertyname="name"type="string"column="NAME"<subclassname="mypack.HourlyEmployee"discriminator-value="HE"<propertyname="rate"column="RATE"type="double"<subclassname="mypack.SalariedEmployee"discriminator-value="SE"</hibernate-在Employee.hbm.xml文件中,<discriminator>元素指定EMPLOYEES表中用于區(qū)分類和SalariedEmployee類,<subclass>元素的discriminator-value</hibernate-在Employee.hbm.xml文件中,<discriminator>元素指定EMPLOYEES表中用于區(qū)分類和SalariedEmployee類,<subclass>元素的discriminator-value屬性指定EMPLOYEE_TYPE字段的取值。EMPLOYEES|ID|NAME|EMPLOYEE_TYPE|RATE|SALARY|COMPANY_ID||||1234||||||||||100||||1111|||Linda||ID12EMPLOYEE_TYPE字段的取值為“HE”,因此它們對應HourlyEmployeeID34EMPLOYEE_TYPE字段的取值為“SE”,因此它們對應SalariedEmployee類的實例。EMPLOYEESnullID1HourlyEmployeeSalariedEmployeeConfigurationconfig=newConfiguration();它的discriminator值,形式如下:“EEEmployeeListemployees=session.find("from以單獨查詢Employee類的兩個子類的實例,例如:ListhourlyEmployees=session.find("fromsourcecode/chapter14/14.2目錄下,運行該程序前,需ant-fileant-filebuild2.xmlfindAllEmployees():檢索數據庫中所有的Employee對象。loadCompany():加載一個Company對象。tx=Listresults=session.find("fromHourlyEmployee");returnselect*fromEMPLOYEESwhereEMPLOYEE_TYPE='HE';select*fromCOMPANIESwhereID=1;tx=Listresults=session.find("fromEmployee");returnselect*fromselect*fromCOMPANIESwhere如果EMPLOYEE_TYPE字段取值為“HE”,就創(chuàng)建HoulyEmployee實例,如果EMPLOYEE_TYPE字段取值為“SESalariedEmployee實例,這些實例所關聯的Company對象也被加載。tx=Hibernateinitialize()方法來顯式初始化employees集合。tx=session.beginTransaction();引用HourlyEmployee實例,就執(zhí)行如下insert語句:insertintovalues(5,引用HourlyEmployee實例,就執(zhí)行如下insert語句:insertintovalues(5,'Mary',300,EMPLOYEES、HESE14-6所示,EMPLOYEESEmployee類的屬性對應的字段,HE表僅包含和HourlyEmployee類的屬性對應的字段,SE表僅包含和SalariedEmployee類的屬性對應的字段。此外,HESEEMPLOYEE_ID字段作圖14- SalariedEmployeeCOMPANIESCompanyHourlyEmployeeSALARIED_EMPLOYEESHOURLY_EMPLOYEESCOMPANYSID<<PK>>圖14- 圖14- 的兩個子類的繼承關系,因此可以映射Company類的employees集合。例程14-7employeesidname14-7<hibernate-mapping<idname="id"type="long"<generator<propertyname="name"type="string"column="NAME"lazy="true"></hibernate-Employee.hbm.xmlEmployeeEMPLOYEES表,在這個映射文件14-8<hibernate-mapping<idname="id"type="long"<generator<propertyname="name"type="string"column="NAME"<keycolumn="EMPLOYEE_ID"<propertyname="rate"column="RATE"type="double"<joined-subclassname="mypack.SalariedEmployee"table="SALARIED_EMPLOYEES"<joined-subclassname="mypack.SalariedEmployee"table="SALARIED_EMPLOYEES"</hibernate-Employee.hbm.xml文件中,兩個<joined-subclass>HourlyEmployee類SalariedEmployee類,<joined-subclass>元素的<key>HESE表中即作為EMPLOYEE_ID14-8EMPLOYEES表、HESE表14-8EMPLOYEES表、HESEHourlyEmployeeSalariedEmployeeConfigurationconfig=newConfiguration();定它們的extends屬性。例如可以在單獨的HourlyEmployee.hbm.xml文件中映射HourlyEmployee類:<hibernate-mapping<hibernate-mappingHourlyEmployeeEmployee.hbm.xml文件中,因此在初始化HibernateConfigurationCompanyEmployee類,還需要加HourlyEmployee類,并且必須先加入Employee父類,再加入HourlyEmployee子類:Configurationconfig=newConfiguration();Listemployees=session.find("fromListemployees=session.find("from以單獨查詢Employee類的兩個子類的實例,例如:ListhourlyEmployees=session.find("fromsourcecode/chapter14/14.3目錄下,運行該程序前,需SAMPLEDBCOMPANIES表、EMPLOYEES表、HESE表,然后加入測試數據,相關的SQL腳本文件為/14.3/schema/sampledb.sql。ant-filebuild3.xmlfindAllEmployees():檢索數據庫中所有的Employee對象。loadCompany():加載一個Company對象。tx=Listresults=session.find("fromHourlyEmployee");returnselect*fromHOURLY_EMPLOYEESheinnerjoinEMPLOYEESeonhe.EMPLOYEE_ID=e.ID;select*fromCOMPANIESwhere值,此外,在加載HourlyEmployee對象時,還會同時加載與它關聯的Company對象。tx=Listresults=session.find("fromEmployee");returnselect*fromEMPLOYEESleftouterjoinHOURLY_EMPLOYEESheone.ID=he.EMPLOYEE_IDleftouterjoinSALARIED_EMPLOYEESseone.ID=se.EMPLOYEE_ID;select*fromCOMPANIESwhereHibernate把EMPLOYEES表與HE表以及SE表進行左外連接,從而獲得HEEMPLOYEE_ID字段不null,就創(chuàng)建HoulyEmployee實例,如SEEMPLOYEE_IDnull,就創(chuàng)HEEMPLOYEE_ID字段不null,就創(chuàng)建HoulyEmployee實例,如SEEMPLOYEE_IDnull,就創(chuàng)SalariedEmployeeCompanytx=Hibernateinitialize()方法來顯式初始化employees集合。tx=session.beginTransaction();引用HourlyEmployee實例,就執(zhí)行如下insert語句:insertintoEMPLOYEES(ID,NAME,COMPANY_ID)values(5,'Mary',1);insertintoHOURLY_EMPLOYEES(EMPLOYEE_ID,RATE)values(5,300);14-1比較方每個具體類對應一個根類對應一個每個類對應一個關系數據模型的復雜缺點:每個具體類對應一表,這些表中包含重復字段優(yōu)點:只需創(chuàng)建一個表缺點:表的數目最多,并表之間還有外鍵參照關系查詢性象,必須查詢所有具體的對應的表數據庫Schema的可維變化,必須修改所有具體類對應的表優(yōu)點:只需修改一張表生變化,只需修改和這個類應的表是否支持多態(tài)查詢和多缺點:不支優(yōu)點:支優(yōu)點:支應一個表的映射方式。如果繼承關系樹中包含接口,可以把它當作抽象類來處理14-9顯示了一顆復雜的繼承關系樹,其中DOClass類為抽象類,其他均為具體類14-9復雜的繼承關系DOClass類、ClassA類和ClassB類為一顆子樹:DOClass類為抽象類,位于整個表的映射方式,ClassA類對應TABLE_A表,ClassB類對應TABLE_B表。類對應TABLE_A表。TABLE_F表,其TABLE_A中包DOClass、ClassA、ClassC、ClassD、ClassG和ClassH的屬性對應的字段。TABLE_B中包含了DOClassClassB的屬性對應的字段,TABLE_ETABLE_FB_ID字段既是主鍵,又是參照TABLE_B表的外鍵關優(yōu)點:符(2)如果子類中的某個屬性不允許為nll對應的字段創(chuàng)建tll約束優(yōu)點:符圖14- 只需創(chuàng)建兩個映射文件,ClassA.hbm.xmlClassB.hbm.xml14-914-圖14- 只需創(chuàng)建兩個映射文件,ClassA.hbm.xmlClassB.hbm.xml14-914-14-9<hibernate-mapping<idname="id"type="long"<generator<discriminatorcolumn="A_TYPE"type="string"<propertyname="a1"type="string"column="A1"<subclassname="mypack.ClassC"discriminator-value="C"<propertyname="c1"column="C1"type="string"<subclassname="mypack.ClassD"discriminator-value="D"<propertyname="d1"column="D1"type="string"<subclassname="mypack.ClassG"discriminator-value="G"<propertyname="g1"column="G1"type="string"<subclassname="mypack.ClassH"discriminator-value="H"<propertyname="h1"column="H1"type="string"</hibernate-14-10<hibernate-mapping<classname="mypack.ClassB"<idname="id"type="long"<generator<propertyname="b1"type="string"column="B1"<propertyname="b1"type="string"column="B1"<joined-subclassname="mypack.ClassE"<keycolumn="B_ID"<propertyname="e1"column="E1"type="string"<propertyname="e2"column="E2"type="string"<propertyname="e3"column="E3"type="string"<propertyname="e4"column="E4"type="string"<propertyname="e5"column="E5"type="string"<propertyname="e6"column="E6"type="string"</joined-subclass<joined-subclassname="mypack.ClassF"<keycolumn="B_ID"<propertyname="f1"column="F1"type="string"<propertyname="f2"column="F2"type="string"<propertyname="f3"column="F3"type="string"<propertyname="f4"column="F4"type="string"<propertyname="f5"column="F5"type="string"<propertyname="f6"column="F6"type="string"</joined-subclass</hibernate-在ClassA.hbm.xml文件中,在用于映射ClassD的<subclass>discriminator-value屬性,Hibernatediscriminator-valueTABLE_A值得注意的是,在<subclass>元素中只能嵌入<subclass子元素,但不能嵌入不能嵌入<subclass>子元素。sourcecode/chapter14/14.4目錄下,運行該程序前,需表,相關的SQL腳本文件為/14.4/schema/sampledb.sql。ant-filebuild4.xmlBusinessService類。BusinessServicemain()test()方法,test()方法tx=ClassGg=newClassFf=newClassFf=newClassG類的實例,就執(zhí)行如下insert語句insertintoTABLE_A(ID,A1,D1,G1,A_TYPE)values(1,'a1','d1',object變量引用ClassF類的實例,就執(zhí)行如下insert語句insertintoTABLE_B(ID,B1)values(1,insertintoTABLE_F(B_ID,F1,F2,F3,F4,F5,F6)values(1,'f1','f2','f3','f4','f5','f6',映射多對一多態(tài)關表,或者每個類對應一個表,那么就能映射Company類的employees集合。本節(jié)介紹如映射多對一多態(tài)關聯。如圖14-11所示,ClassDClassA為多對一多態(tài)關聯關系114-11ClassD與ClassA為多對一多態(tài)關聯關或者每個類對應一個表,那么可以按以下方式映射ClassD的a屬性:cascade="save-update"假定ClassD對應的表TABLE_DClassA對應的表TABLE_A中定義了外鍵A_ID,它參照TABLE_A表的主ClassD對象a屬性既可以引用ClassB對象,也可以引用ClassC對象,例如tx=ClassDd=(ClassD)session.get("ClassD",id);ClassAa=d.getA();if(ainstanceofClassB)if(ainstanceofClassC)以下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025車輛保管合同書范文
- 2025保修工程合同范本
- 2025學校食堂承包合同書
- 2025關于試用期解除合同及案例
- 2025年度軍事電子對抗保密技術合同3篇
- 2025年度新能源充電設施建設公司合作協議書3篇
- 二零二五年度農村房屋租賃合同(含農業(yè)產業(yè)升級)
- 二零二五年度體育場館租賃合同及賽事運營協議3篇
- 2025年度農村個人地基使用權轉讓及農業(yè)現代化設施配套協議書3篇
- 2025年度教育信息化項目經理合作協議2篇
- 2023-2024學年廣東省深圳市光明區(qū)高二(上)期末地理試卷
- 【8地RJ期末】安徽省蕪湖市弋江區(qū)2023-2024學年八年級上學期期末考試地理試卷(含解析)
- 2025年春季幼兒園后勤工作計劃
- 鑄牢中華民族共同體意識的培養(yǎng)路徑
- 世界各大洲國家中英文、區(qū)號、首都大全
- 2024-2030年中國波浪發(fā)電商業(yè)計劃書
- 《中國腎性貧血診療的臨床實踐指南》解讀課件
- 2024年人教版八年級數學上冊期末考試卷(附答案)
- 電大本科《西方經濟學》期末試題標準題庫及答案(試卷號:1026)
- SCI論文寫作課件
- (完整版)展廳展館博物館美術館設計標招標評分細則及打分表
評論
0/150
提交評論