版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、繼承關系樹中的每個具體類對應一個表的實現(xiàn)示例1、實現(xiàn)的基本原理-把每個具體類映射到一張表是最簡單的映射方式(1)問題下面以人事管理系統(tǒng)中的人員繼承關系映射問題作為示例來加以說明,如下圖所示。在關系數(shù)據(jù)模型中我們需定義Companines、Hourly_Employees和Salaried_Employees三張數(shù)據(jù)庫表。把 Salaried_Employees 表簡稱為 SE 表。為了敘述的方便,下文把Hourly_Employees表簡稱為HE表,iti畛 LiLi-iL-ai.auac:-貿(mào) DataBase號關系圖二1表色 視圖耳存儲過程電用戶密角色J規(guī)則二I跋認r用戶定義的數(shù)據(jù)類型 思
2、用戶定義的函數(shù) 宣全文目錄+ 甘 HDataBase+ 劇 master+ 期 model+ 劇 msdbI_| booKAutnordbofflrZUUb-y- lU:Jb:Zb回 CARDdbo用戶2006-9-4 10:36:26回縹dbo國尸四快:距Ijcorripaninesdbo用戶2006-9-4 10:36:26J dtpropertiesdbo系統(tǒng)2006-9-4 10:36:39EBookdbo用戶2006-9-4 10:36:26駕 Fileinfodbo用戶2006-9-4 10:36:26FileInfo_Listdbo用戶2006-10-26 11:08:51Fil
3、eInfo_Mapdbo用戶2006-10-26 13:38:09FileUserlnfodbo用戶2口|。6-勺-4 1 口滂 HOURL_EMPLOEE5dbo用戶2006-9-4 10:36:26Hl MailUserlnFodbo用戶2006-9-4 10:36:26Hl PERSONdbo用戶2006-9-4 10:36:26| Publishdbo用戶2口|。6-勺-4 1 口滂SALARIED_EMPLOYEE5dbo用戶2006-9-4 10:36:26|ElsomeUserdbo用戶2006-9-4 10:36:26(2)映射方式我們的持久類ourlyEmployee類和HE
4、表對應,HourlyEmployee類本身的rate屬性,以及從Employee 類中繼承的id屬性和name屬性,在HE表中都有對應的字段。此外,HourlyEmployee類繼承了 Employee 類與Company類的關聯(lián)關系,與此對應,在HE表中定義了參照Companines表的COMPANY_ID外鍵。SalariedEmployee類和SE表對應,SalariedEmployee類本身的salary屬性,以及從Employee類中繼承 的id屬性和name屬性,在SE表中都有對應的字段。此外,SalariedEmployee類繼承了 Employee類與 Company類的關聯(lián)關
5、系,與此對應,在SE表中定義了參照COMPANIES表的COMPANY_ID外鍵。2、Companines表的設計(1)Companines 表的結(jié)構列名數(shù)據(jù)類型長度允許空固int4n:diri env:f ch:=Lf50(2)Companines表中的數(shù)據(jù)四|祗巨亟直|呼| 矮明|以攵I家匡IDTL:=ifTiH1ICTAC2EilfghtdEghfilE13、HOURLY_EMPLOYEES (HE)表的設計(1) hourLY_employees (皿)表的結(jié)構aT僉I若是疆|能鸛邙髓|呷或回列名數(shù)據(jù)類型長度允許空id|int4C ump:dTiylllint4N:dIT|Hnvar
6、char50Ratefluat8(2) HOURLY_EMPLOYEES (HE)表中的數(shù)據(jù)4、SALARIED_EMPLOYEES (SE )表的設計(1) salariED_employees (SE)表的結(jié)構I&U 昭峪|件I酯鷺邙騷|吒玷回列名數(shù)據(jù)類型長度允許空id|int4C ump:inylDint4N:dITieriv:f i:h:=Lf50s al :i-yfloat8(2) SALARIED_EMPLOYEES (SE)表中的數(shù)據(jù)巨口亟宜聲!矮眇|斜斜職匡IDComp:=iTLyIIlILdiTiee :=il :=Lt_y11li40021W:ilLg6005、設計各個持久
7、化(1) Company 類 package examples; public class Company ( private int id; private String name; public Company() ( public int getId() ( return id;private void setId(int id) ( this.id = id;public String getName() ( return name;public void setName(String name) ( = name;public boolean equals(Object other)
8、 (if (this = other) (return true;if (! (other instanceof Company) (return false;return true;Employee 類package examples;public abstract class Employeepublic Employee() private int id;public int getId() return id;private void setId(int id) this.id = id;private String name;public String getName() retur
9、n name;public void setName(String name) = name;private Company company;由于 Employee 類與 Company 類存在“一對一”的關系public Company getCompany() return company;public void setCompany(Company company) pany = company;public abstract void work(String content);由于Employee類為抽象類HourlyEmployee類package examples;public c
10、lass HourlyEmployee extends Employeepublic HourlyEmployee() private float rate;public float getRate() return rate;public void setRate(float rate) this.rate = rate;public boolean equals(Object other) if (this = other) return true;if (! (other instanceof HourlyEmployee) return false;return true;public
11、 void work(String content)(3) SalariedEmployee類package examples;public class SalariedEmployee extends Employeepublic SalariedEmployee() private float salary;public float getSalary() return salary;public void setSalary(float salary) this.salary = salary;public boolean equals(Object other) if (this =
12、other) return true;if (! (other instanceof SalariedEmployee) return false;return true;public void work(String content)6、為每個數(shù)據(jù)庫表建立映射文件(1)各個映射文件之間的關系Company類、HourlyEmployee類和SalariedEmployee類都有相應的映射文件,而Employee類沒有相 應的映射文件。下圖顯示了持久化類、映射文件和數(shù)據(jù)庫表之間的對應關系。注意:如果Employee類不是抽象類,即Employee類本身也能被實例化,此時應該采用我們后面所要講到
13、的 第三種方式來加以實現(xiàn)請見后面的說明。那么我們還需要為Employee類創(chuàng)建對應的EMPLOYEES表,此時HE表和SE表的結(jié)構仍然和上面 圖中所示的一樣。這意味著在EMPLOYEES表、HE表和SE表中都定義了相同的NAME字段以及參照 COMPANIES 表的外鍵 COMPANYID。另外,還需為Employee類創(chuàng)建單獨的Employee.hbm.xml文件。(2)創(chuàng)建映射文件Company.hbm.xml新建 Company.hbm.xml 文件JO BinMem口 EdipseJ25EApp-“爵 HWebMapping臼? .myedipse-& src-m examples文件
14、創(chuàng)建新文件資源。Jl BankUser.javaJl Book, javaJl BookAuthor.iaJ Card.javaCat. javaEBook, javaEmail.javaHibernateDAOEHibernateDAOIHibernateUtil.jcPerson, java輸入或選擇父文件夾(少: |HWebMapping/src昏e 0-噂 HWebMapping_ .myedipse+ & src+ & WebRoot7 Publish.java 7 UserInFo_Li5t.j. UserInFo_Map. 7 UserInFo_5et.j.交件名(州):(Com
15、pany.hbm.xmlJj Userinfo.java EiankUser.hbm.xml Book.hbm.xml BookAuthor.hbm.xi Card. hbm. xml Cat.hbm.xml FRrink.hhm.yml該文件的內(nèi)容如下注意:該方法的主要缺點是不支持多態(tài)關聯(lián)。從Company類到Employee類是多態(tài)關聯(lián),但是由于關系數(shù)據(jù)模型沒有描述Employee類和它的兩個 子類的繼承關系,因此無法映射Company類的employees集合。因此,在上面的Company.hbm.xml文件中 僅僅映射了 Company類的id和name屬性。(3)創(chuàng)建映射文件Hour
16、lyEmployee.hbm.xml 文件用于把HourlyEmployee類映射到HE表,在這個映射文件中,除了需要映射HourlyEmployee類本身 的rate屬性,還需要映射從Employee類中繼承的name屬性,此外還要映射從Employee類中繼承的與 Company類的關聯(lián)關系。新建 HourlyEmployee.hbm.xml 文件return files;I BinMem口 EdipseJ25EApp ? HWebMapping ,白.myedipse-Lzh src-矽 examples J BankUser.javc17 Book, java7 BookAuthorJ
17、c7 Card.java Cat.java EBook.java Email.java HibernateDAC HibernateDAC HibernateUtil.: Person, java Publish.java U5erInFo_Li5t. U5erInFo_Map U5erInFo_5et.電新建文件文件創(chuàng)建新文件資源。輸入或選擇父文件夾(鳥: |HWebMapping/src100T歸 HWebMapping9 .myedipse+ 9 src+ 0 WebRoot文件名(匝):|HourlyEmployee.hbm.xml高魏由7 UserlnFo.java BankUser
18、. hbm.xm Book. hbm.xml BookAuthor.hbm.; Card.hbm.xml Cat. hbm. xml Company.hbm.xm EBook, hbm. xml hibernate, cfg. xml lnn4i.nrnnftrHft該文件的內(nèi)容如下注意:其中的標簽主要是為了實現(xiàn)“EmployeeCompany”的“一對一”的關聯(lián)映射。(4)創(chuàng)建映射文件SalariedEmployee.hbm.xml 文件用于把SalariedEmployee類映射到SE表,在這個映射文件中,除了需要映射SalariedEmployee類本身 的salary屬性,還需要映射從
19、Employee類中繼承的name屬性,此外還要映射從Employee類中繼承的與 Company類的關聯(lián)關系。I | BinMem口 EdipseJ25EApp-“1 HWebMapping 臼? .myedipse -& src-跨 examplesJ BankUser.java Book.iava BcicikAuthcir,間 Card.java Cat.java EBook.java 囚 Email.java 7 HibernateDAOE ,J, HibernateDAO T| HibernateUtil.j ,J, Person.java T| Publish.java T| U
20、serInfo_List.j ,J, UserInfo_Map. T| Userlnfo_5et.j ,J, Userinfo.java BankUser. hbm. xml Book.hbm.xml BookAuthor.hbm.x Card.hbm.xml Cat.hbm.xml Company, hbm. xml CO.-.1. J.J.LL. ,.LL.I新建文件1r|HWebMapping/src壽O O-H HWebMapping 昌.myedipse +I-& src + & WebRoot文件名|5alariedEmployee.hbm.xml高魏與 該文件的內(nèi)容如下注意:其中
21、的標簽主要是為了實現(xiàn)“EmployeeCompany”的“一對一”的關聯(lián)映射。(5)在hibernate.cfg.xml文件中增加對這些文件的關聯(lián)每 +hibernate.cfg.xmlx HourlyEmployee.hb.i SalariedEmployeeW12java: c omp/ env/ j db c/ dat as our c etrueres our 06= EBook, hbm. Kml,T/resour06=Publish, hbm.:mappingmappingmappingmappingmappingresource=BookAuthor. hbm. Kml,v/ma
22、pping resource=,TUserInf o. hbm.:mapping resource=,TUserInf o_Set. hbm. xml/mapping resource=,TUserInf o_List. hbm. xml/mappinE rEmciurcE=UmErInf n_Map. hbm. xml/ 口口inE rEmciurcen SalariedmplciyEE. hbm. xml/7、在我們的DAO組件類HibernateDAOBean中提供操縱持久對象的數(shù)據(jù)訪問方法(1)增加一個 doFindAllEmployees 方法public boolean doFin
23、dAllEmployees。throwsHibernateException List results = new ArrayList();try session = HibernateUtil.currentSession();tx = session.beginTransaction();List hourlyEmployees = session.createQuery(from HourlyEmployee).list();results.addAll(hourlyEmployees);List salariedEmployees = session.createQuery(from
24、SalariedEmployee).list();results.addAll(salariedEmployees);printAllEmployeeInfo(results);mit();catch (HibernateException he) log.error(在 doSelectBookDataFromDB 方法中出現(xiàn)了 HibernateException 錯誤”,he);throw he;finally HibernateUtil.closeSession();return true;public void printAllEmployeeInfo(java.util.List
25、allEmplyList)java.util.Iterator iterator=allEmplyList.iterator();while(iterator.hasNext()examples.Employee oneEmployee=(examples.Employee)iterator.next();if(oneEmployee instanceof examples.HourlyEmployee)int companyID=(examples.HourlyEmployee)oneEmployee).getCompany().getId();String companyName=(exa
26、mples.HourlyEmployee)oneEmployee).getCompany().getName();int HEmployeeID=(examples.HourlyEmployee)oneEmployee).getId();String name=(examples.HourlyEmployee)oneEmployee).getName();float rate=(examples.HourlyEmployee)oneEmployee).getRate();System.out.print(companyID=+companyID+t);System.out.print(comp
27、anyName=+companyName+t);System.out.print(HEmployeeID=+HEmployeeID+t);System.out.print(name=+name+t);System.out.print(rate=+rate+n);elseint companyID=(examples.SalariedEmployee)oneEmployee).getCompany().getId();String companyName=(examples.SalariedEmployee)oneEmployee).getCompany().getName();int SEmp
28、loyeeID=(examples.SalariedEmployee)oneEmployee).getId();String name=(examples.SalariedEmployee)oneEmployee).getName();float salary=(examples.SalariedEmployee)oneEmployee).getSalary();System.out.print(companyID=n+companyID+ntn);System.out.print(companyName=+companyName+t);System.out.print(SEmployeeID
29、=+SEmployeeID+t);System.out.print(name=+name+t);System.out.print(salary=+salary+n);(2)在index.jsp中訪問DAO方法8、執(zhí)行該 Web 應用(http:127001:8080/HWebMapping/index.jsp)lb: 1 Ei: 594W1 IMbO iziessiorihactorytjbject?actorj: 8X - Wot binding factorj to JWD1= no JPJD1 naiR巳 conf igured 15: 16: 59j 484 INFO SessionF
30、actorylmp 1:353 - Checking 0 rL:3ined HQL queries IS: 16: 59S31 IMFO 口nF:ac:t口rylm口 1: 3T3 th巳eking: U Hamed W4L queries:Hibernat e: select hourlyemplO_. ID Hibernat e: select salariedemLl_. ID Hibernate: select conp:myO_. ID as ci:imp:inyID: ci:imp:inyID comp:ifLyID c ump any ID1111CQJTLpanyNam 已 c
31、omp:dnyN:iiTLe EmpanyUajr詬 companyN:iiTLeICT ACICT ACICT ACICT ACas ID 17_j hourlyemp10_. Marne as Marne 17_, hourlyemp10_. Rate as Rate17_s hourlyemp10_. Companyl as ID 18_j salariedeniLl_. N:djrie as N:djrie 18_., salariedemLI_. salary as salary 18_., s al ar i e deml_. Comp| ID 16_0_j conp:myO_.
32、n:iTLe as n:iTLe 16_0_ from Cdmijamn巳蘭 company。_ where company。. -TTVHEmployeelD:HEmployeelDSEmployeelDSEmployeelD9、體驗Hibernate中l(wèi)azy技術lb: ziy: Utij blM IPJbCi essionbact ory 1 mpi: bJ - Checking U n:djried HRL queries IS: 2!8: 口旗 64i IMFO 5巳口rvlmpl: 3T3 匚heciiig: D named W4L 口ueri巳三 iii _如果將對Company
33、表的訪問代碼(也就是上面的黑體部分)除掉,然后再次執(zhí)行,將發(fā)現(xiàn)沒有對 Company表進行查詢,因為Hibernate缺省時是采用lazy加載的。只在真正需要該數(shù)據(jù)時,才加載所關聯(lián) 的數(shù)據(jù)。ibernate: select hLiurljemplO_. ID as ID 1 hourlyemplO_. N:ime as N:irLe 17_s huurlyemp 10_. Rate as Rat e 1hourlyemp 10_. CDmpanyI| :ibernat e:EmployeeIDEmployeeIDSEmployeelD10、在doFindAllEmployees方法中增加保存數(shù)據(jù)的代碼(1)代碼示例public boolean doFindAllEmployees。throwsHibernateException (List
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋交易終止合同范本
- 農(nóng)村土地出售合同書樣本
- 停車場租賃合同協(xié)議書范文
- 2024養(yǎng)殖場土地承包合同
- 股票投資代持協(xié)議書
- 2024年彩鋼瓦安裝合同書
- 2024產(chǎn)權轉(zhuǎn)讓居間合同協(xié)議書
- 工程機械運輸合同模板
- 個人之間專利權轉(zhuǎn)讓協(xié)議范本
- 2024年按揭房屋歸女方離婚協(xié)議書
- 2024全球量子產(chǎn)業(yè)發(fā)展報告
- 場地移交安全管理協(xié)議書
- 醫(yī)院卒中中心建設各種制度、流程匯編
- 重慶市江北區(qū)2023-2024學年六年級下學期期末考試數(shù)學試題
- 軍隊文職聘用合同管理規(guī)定
- 2024年貴州省安順市西秀區(qū)小升初語文試卷
- 2024-2029年中國兒童牙冠行業(yè)市場現(xiàn)狀分析及競爭格局與投資發(fā)展研究報告
- 新時代鐵路發(fā)展面對面全文內(nèi)容
- 人工智能與語文閱讀理解教學
- 科學素養(yǎng)培育及提升-知到答案、智慧樹答案
- 快遞主管崗位職責
評論
0/150
提交評論