版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、继承关系树中的每个具体类对应一个表的实现示例1、实现的基本原理-把每个具体类映射到一张表是最简单的映射方式(1)问题下面以人事管理系统中的人员继承关系映射问题作为示例来加以说明,如下图所示。在关系数据模型中我们需定义Companines、Hourly_Employees和Salaried_Employees三张数据库表。把 Salaried_Employees 表简称为 SE 表。为了叙述的方便,下文把Hourly_Employees表简称为HE表,iti畛 LiLi-iL-ai.auac:-贸 DataBase号关系图二1表色 视图耳存储过程电用户密角色J规则二I跋认r用户定义的数据类型 思
2、用户定义的函数 宣全文目录+ 甘 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系统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类的关联关系,与此对应,在HE表中定义了参照Companines表的COMPANY_ID外键。SalariedEmployee类和SE表对应,SalariedEmployee类本身的salary属性,以及从Employee类中继承 的id属性和name属性,在SE表中都有对应的字段。此外,SalariedEmployee类继承了 Employee类与 Company类的关联关
5、系,与此对应,在SE表中定义了参照COMPANIES表的COMPANY_ID外键。2、Companines表的设计(1)Companines 表的结构列名数据类型长度允许空固int4n:diri env:f ch:=Lf50(2)Companines表中的数据四|祗巨亟直|呼| 矮明|以攵I家匡IDTL:=ifTiH1ICTAC2EilfghtdEghfilE13、HOURLY_EMPLOYEES (HE)表的设计(1) hourLY_employees (皿)表的结构aT佥I若是疆|能鹳邙髓|呷或回列名数据类型长度允许空id|int4C ump:dTiylllint4N:dIT|Hnvar
6、char50Ratefluat8(2) HOURLY_EMPLOYEES (HE)表中的数据4、SALARIED_EMPLOYEES (SE )表的设计(1) salariED_employees (SE)表的结构I&U 昭峪|件I酯鹭邙骚|吒玷回列名数据类型长度允许空id|int4C ump:inylDint4N:dITieriv:f i:h:=Lf50s al :i-yfloat8(2) SALARIED_EMPLOYEES (SE)表中的数据巨口亟宜声!矮眇|斜斜职匡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、为每个数据库表建立映射文件(1)各个映射文件之间的关系Company类、HourlyEmployee类和SalariedEmployee类都有相应的映射文件,而Employee类没有相 应的映射文件。下图显示了持久化类、映射文件和数据库表之间的对应关系。注意:如果Employee类不是抽象类,即Employee类本身也能被实例化,此时应该采用我们后面所要讲到
13、的 第三种方式来加以实现请见后面的说明。那么我们还需要为Employee类创建对应的EMPLOYEES表,此时HE表和SE表的结构仍然和上面 图中所示的一样。这意味着在EMPLOYEES表、HE表和SE表中都定义了相同的NAME字段以及参照 COMPANIES 表的外键 COMPANYID。另外,还需为Employee类创建单独的Employee.hbm.xml文件。(2)创建映射文件Company.hbm.xml新建 Company.hbm.xml 文件JO BinMem口 EdipseJ25EApp-“爵 HWebMapping臼? .myedipse-& src-m examples文件
14、创建新文件资源。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该文件的内容如下注意:该方法的主要缺点是不支持多态关联。从Company类到Employee类是多态关联,但是由于关系数据模型没有描述Employee类和它的两个 子类的继承关系,因此无法映射Company类的employees集合。因此,在上面的Company.hbm.xml文件中 仅仅映射了 Company类的id和name属性。(3)创建映射文件Hour
16、lyEmployee.hbm.xml 文件用于把HourlyEmployee类映射到HE表,在这个映射文件中,除了需要映射HourlyEmployee类本身 的rate属性,还需要映射从Employee类中继承的name属性,此外还要映射从Employee类中继承的与 Company类的关联关系。新建 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.电新建文件文件创建新文件资源。输入或选择父文件夹(鸟: |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该文件的内容如下注意:其中的标签主要是为了实现“EmployeeCompany”的“一对一”的关联映射。(4)创建映射文件SalariedEmployee.hbm.xml 文件用于把SalariedEmployee类映射到SE表,在这个映射文件中,除了需要映射SalariedEmployee类本身 的salary属性,还需要映射从
19、Employee类中继承的name属性,此外还要映射从Employee类中继承的与 Company类的关联关系。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高魏与 该文件的内容如下注意:其中
21、的标签主要是为了实现“EmployeeCompany”的“一对一”的关联映射。(5)在hibernate.cfg.xml文件中增加对这些文件的关联每 +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中提供操纵持久对象的数据访问方法(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 方法中出现了 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、执行该 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中lazy技术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、表的访问代码(也就是上面的黑体部分)除掉,然后再次执行,将发现没有对 Company表进行查询,因为Hibernate缺省时是采用lazy加载的。只在真正需要该数据时,才加载所关联 的数据。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方法中增加保存数据的代码(1)代码示例public boolean doFindAllEmployees。throwsHibernateException (List
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肠阿米巴病病因介绍
- 肝衰竭病因介绍
- 部编版四年级语文上册第三单元导读《处处留心皆学问》精美课件
- 老年人喉癌病因介绍
- 《客户关系管理实务》电子教案 30客户服务概述
- 北师大版七年级生物上册第2单元第4章第2节生物体的器官、系统教学课件
- 《短文三篇》课件
- 教科版小学综合实践6下(教案+课件)6 让我们的学校更美好 庄诗倩
- 《神经系统查体》课件
- 《BAS架构培训》课件
- 浙江省强基联盟2024-2025学年高三上学期8月联考 数学试题(含解析)
- 五年级上册解方程练习100题及答案
- 登革热防控知识考试试题
- 肿瘤所治疗所致血小板减少症诊疗指南
- DB3305-T 125-2019家庭医生签约服务与评价规范
- 建筑制图基础-国家开放大学电大机考网考题目答案
- 中考英语词汇
- 3.3 场域与对话-公共空间里的雕塑 课件-高中美术人美版(2019)美术鉴赏
- 2024年永州职业技术学院单招职业技能测试题库及答案解析
- 中图版地理七年级上册《第一节 疆域和行政区划》教学设计5
- SMP-10-003-00 药品上市后风险管理规程
评论
0/150
提交评论