文件第14章映射繼承關(guān)系_第1頁
文件第14章映射繼承關(guān)系_第2頁
文件第14章映射繼承關(guān)系_第3頁
文件第14章映射繼承關(guān)系_第4頁
文件第14章映射繼承關(guān)系_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

14映射繼承關(guān)在域模型中,類與類之間除了關(guān)聯(lián)關(guān)系和聚集關(guān)系14映射繼承關(guān)在域模型中,類與類之間除了關(guān)聯(lián)關(guān)系和聚集關(guān)系,還可以存在繼承關(guān)系,在圖14-1的域模型中,CompanyEmployee類之間為一對多的雙向關(guān)聯(lián)關(guān)系(假定不允許雇員同,EmployeeEmployee類、HourlyEmployeeSalariedEmployee類構(gòu)成了一顆繼承關(guān)系樹 14-1包含繼承關(guān)系的域模態(tài)是指當(dāng)一個Java應(yīng)用變量被聲明為Employee類時,這個變量實際上既可以引用現(xiàn)了多Listemployees=businessService.findAllEmployees();Iteratorit=employees.iterator();if(einstanceofSystem.out.println(e.getName()+"System.out.println(e.getName()+"}BusinessServicefindAllEmployees()方法通HibernateAPI從數(shù)據(jù)庫中檢索出所有含SalariedEmployee類的實例,這種查詢被稱為多態(tài)查詢。以上程序中變量e被聲明為Employee類型,它實際上既可能引用HourlyEmployee類的實例,也可能引用SalariedEmployee類的實例。類不是多態(tài)關(guān)聯(lián),因Employeecompany屬性只會引Company類本身的實例。呢?本章將介紹以下三種映射方式salary:rate:name:Stringid:Longcompany:14-2所示,在關(guān)系數(shù)據(jù)模型中14-2所示,在關(guān)系數(shù)據(jù)模型中及從Employee類中繼承的id屬性和name屬性,在HE表中都有對應(yīng)的字段。此外,義了參照COMPANIES表的COMPANY_ID外鍵。SalariedEmployee類和SE表對應(yīng),SalariedEmployee類本身的salary屬性,以及從Employee類中繼承的id屬性和name屬性,在SE表中都有對應(yīng)的字段。此外,SalariedEmployeeEmployeeCompanySE表中14-2Company類、HourlyEmployee類和SalariedEmployee類都有相應(yīng)的映射文件,而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表,然后加入測試數(shù)據(jù),相關(guān)的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()會同時加載與它關(guān)聯(lián)的Company對象。select*fromSalariedEmployee類到Company類不是多態(tài)關(guān)聯(lián),在加載SalariedEmployee對象時,被加載到內(nèi)存中,所以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,這種映射方式只需為繼承關(guān)系樹Employee根類創(chuàng)建一張EMPLOYEES。如圖14-4所子類的所有屬型對應(yīng)的字段,此外,EMPLOYEES表中需要額外加入一個字符串類型的圖14- 圖14- SalariedEmployeeCOMPANIESCompanyHourlyEmployeeCOMPANYSID<<PK>> 的兩個子類的繼承關(guān)系,因此可以映射Company類的employees集合。例程 的兩個子類的繼承關(guān)系,因此可以映射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”,因此它們對應(yīng)HourlyEmployeeID34EMPLOYEE_TYPE字段的取值為“SE”,因此它們對應(yīng)SalariedEmployee類的實例。EMPLOYEESnullID1HourlyEmployeeSalariedEmployeeConfigurationconfig=newConfiguration();它的discriminator值,形式如下:“EEEmployeeListemployees=session.find("from以單獨查詢Employee類的兩個子類的實例,例如:ListhourlyEmployees=session.find("fromsourcecode/chapter14/14.2目錄下,運行該程序前,需ant-fileant-filebuild2.xmlfindAllEmployees():檢索數(shù)據(jù)庫中所有的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實例,這些實例所關(guān)聯(lián)的Company對象也被加載。tx=Hibernateinitialize()方法來顯式初始化employees集合。tx=session.beginTransaction();引用HourlyEmployee實例,就執(zhí)行如下insert語句:insertintovalues(5,引用HourlyEmployee實例,就執(zhí)行如下insert語句:insertintovalues(5,'Mary',300,EMPLOYEES、HESE14-6所示,EMPLOYEESEmployee類的屬性對應(yīng)的字段,HE表僅包含和HourlyEmployee類的屬性對應(yīng)的字段,SE表僅包含和SalariedEmployee類的屬性對應(yīng)的字段。此外,HESEEMPLOYEE_ID字段作圖14- SalariedEmployeeCOMPANIESCompanyHourlyEmployeeSALARIED_EMPLOYEESHOURLY_EMPLOYEESCOMPANYSID<<PK>>圖14- 圖14- 的兩個子類的繼承關(guān)系,因此可以映射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表,然后加入測試數(shù)據(jù),相關(guān)的SQL腳本文件為/14.3/schema/sampledb.sql。ant-filebuild3.xmlfindAllEmployees():檢索數(shù)據(jù)庫中所有的Employee對象。loadCompany():加載一個Company對象。tx=Listresults=session.find("fromHourlyEmployee");returnselect*fromHOURLY_EMPLOYEESheinnerjoinEMPLOYEESeonhe.EMPLOYEE_ID=e.ID;select*fromCOMPANIESwhere值,此外,在加載HourlyEmployee對象時,還會同時加載與它關(guān)聯(lián)的Company對象。tx=Listresults=session.find("fromEmployee");returnselect*fromEMPLOYEESleftouterjoinHOURLY_EMPLOYEESheone.ID=he.EMPLOYEE_IDleftouterjoinSALARIED_EMPLOYEESseone.ID=se.EMPLOYEE_ID;select*fromCOMPANIESwhereHibernate把EMPLOYEES表與HE表以及SE表進(jìn)行左外連接,從而獲得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īng)一個根類對應(yīng)一個每個類對應(yīng)一個關(guān)系數(shù)據(jù)模型的復(fù)雜缺點:每個具體類對應(yīng)一表,這些表中包含重復(fù)字段優(yōu)點:只需創(chuàng)建一個表缺點:表的數(shù)目最多,并表之間還有外鍵參照關(guān)系查詢性象,必須查詢所有具體的對應(yīng)的表數(shù)據(jù)庫Schema的可維變化,必須修改所有具體類對應(yīng)的表優(yōu)點:只需修改一張表生變化,只需修改和這個類應(yīng)的表是否支持多態(tài)查詢和多缺點:不支優(yōu)點:支優(yōu)點:支應(yīng)一個表的映射方式。如果繼承關(guān)系樹中包含接口,可以把它當(dāng)作抽象類來處理14-9顯示了一顆復(fù)雜的繼承關(guān)系樹,其中DOClass類為抽象類,其他均為具體類14-9復(fù)雜的繼承關(guān)系DOClass類、ClassA類和ClassB類為一顆子樹:DOClass類為抽象類,位于整個表的映射方式,ClassA類對應(yīng)TABLE_A表,ClassB類對應(yīng)TABLE_B表。類對應(yīng)TABLE_A表。TABLE_F表,其TABLE_A中包DOClass、ClassA、ClassC、ClassD、ClassG和ClassH的屬性對應(yīng)的字段。TABLE_B中包含了DOClassClassB的屬性對應(yīng)的字段,TABLE_ETABLE_FB_ID字段既是主鍵,又是參照TABLE_B表的外鍵關(guān)優(yōu)點:符(2)如果子類中的某個屬性不允許為nll對應(yīng)的字段創(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目錄下,運行該程序前,需表,相關(guān)的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)關(guān)表,或者每個類對應(yīng)一個表,那么就能映射Company類的employees集合。本節(jié)介紹如映射多對一多態(tài)關(guān)聯(lián)。如圖14-11所示,ClassDClassA為多對一多態(tài)關(guān)聯(lián)關(guān)系114-11ClassD與ClassA為多對一多態(tài)關(guān)聯(lián)關(guān)或者每個類對應(yīng)一個表,那么可以按以下方式映射ClassD的a屬性:cascade="save-update"假定ClassD對應(yīng)的表TABLE_DClassA對應(yīng)的表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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論