Hibernate中的继承关系的映射实现_第1页
Hibernate中的继承关系的映射实现_第2页
Hibernate中的继承关系的映射实现_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Hibernate中的继承关系的映射实现1、继承关系的描述在域模型中,类与类之间除了关联关系和聚集关系,还可以存在继承关系,在下面的图中所示的域模型中,Company类和Employee类之间为一对多的双向关联关系(假定不允许雇员同时在多个公司兼职),Employee类为抽象类,因此它不能被实例化, 它有两个具体的子类:HourlyEmployee类和SalariedEmployee由于Java只允许一个类最多有一个直接的 父类,因此Employee类、HourlyEmployee类和SalariedEmployee类构成了一棵继承关系树。2、OO呻的多态的概念-OOP中的多态(1)OOP中的

2、多态在面向对象的范畴中,还存在多态的概念,多态建立在继承关系的基础上。简单地理解,多态是指当一个Java应用变量被声明为基类的类型时(如定义为Employee类时),这个变量实际上既可以引用其各个子类的实例(如HourlyEmployee类的实例,也可以引用SalariedEmployee类的实例)。(2)代码示例以下这段程序代码就体现了多态:List employees= businessService.findAllEmployees();Iterator it=employees.iterator();while(it.hasNext()Employee oneEmployee =(Em

3、ployee)it.next();if(oneEmployee instanceof HourlyEmployee)System.out.println(oneEmployee.getName()+ +(HourlyEmployee) oneEmployee).getRate();elseSystem.out.println(oneEmployee.getName()+ +(SalariedEmployee) oneEmployee).getSalary();3、多态查询的应用(1)多态查询如果我们 在BusinessService类的findAllEmployees()方法中通过Hibern

4、ate API从数据库中检索出所有Employee对象(基类),则将会在findAllEmployees()方法返回的集合中将包含Employee基类的各个子类 的对象,也就是既包含有HourlyEmployee类的实例,同时也包含SalariedEmployee类的实例,这种查询被 称为多态查询。以上程序中变量oneEmployee被声明为Employee类型,它实际上既可能引用HourlyEmployee类的实例,也可能引用SalariedEmployee类的实例。(2)多态关联此外,从Company类到Employee类为多态关联,因为Company类的employees集合中可以包含H

5、ourlyEmployee类和SalariedEmployee类的实例。从Employee类到Company类不是多态关联,因为Employee类的company属性只会引用Company类本身的实例。数据库表之间并不存在继承关系,那么如何把域模型的继承 关系映射到关系数据模型中呢4、实现继承关系的三种映射方式在Hibernate中对于继承映射到数据表有几种不同的策略,各有适用的不同场合。下面以Person基类以及其两个子类Student和Professor类为例来说明。(1)每个具体子类映射成单个数据库表-而抽象基类不参与映射简单:表中包含了具体子类的所有信息。缺点类的修改会导致相对应的表及

6、其子类所对应表的更改角色的更改会造成ID的重新赋值(因为不同子类的ID可能重复)难以在支持多重角色时,保持数据的完整性。这种策略适合在类层次结构上有一定数量的抽象类的情况下使用,同样有两种方式,一种是采用显式 多态的方式,另一种是采用隐式多态的方式,显式多态采用的为hibernate.union-subclass的方式,隐式多态则采用每个具体类的PO独立建表的策略,在它的映射文件中将看不出任何的和接口、抽象类的关系,同时对于抽象类,需要指明其abstract= true”。关系数据模型完全不支持域模型中的继承关系和多态。(2)将整个类层次映射为单个数据库表-单表策略单表策略很容易理解,就是将基

7、类、各个子类中所有的属性都放至一张表中,这对于子类属性不多的情况非常有效-每个子类代表表中由识别器列(discriminator column)标识的一行。该方法的优点实现简单;支持多态对象角色发生变化,或存在多重角色时; 报表操作实现简单:表中包含了所有信息。该方法的缺点增加类层次中的耦合,类层次中任何类的属性的增加会导致表的变更如果在某个子类属性的修改错误会影响到整个层次结构,而不仅仅是该子类。浪费了大量的数据库空间;可能需要指明具体的角色。这将失去数据库对Not Null的约束,从数据完整性的角度看,问题很严重。对关系数据模型进行非常规设计,在数据库表中加入额外的区分子类型的字段。通过这

8、种方式,可以使关系数据模型支持继承关系和多态。同时在Hibernate中通常将子类定义为的方式来实StudentProfessor&tudentNumbersalary每个具体类一张表Person由于是抽象类,未 映射成数据库表;而Student、Professor类映射为相应的表,它们具有各自的主键。优点报表操作实现Studentprimary keystudentOID medentil umberProfessor岛imary ke扩aprofessorOIDsalaryPerson%prinnarykay personOID;obj ectType时mestudentNumbe

9、rsalary409现这个策略。(3)每个类均映射为数据库表 -继承关系树的每个类对应一个表就是用外键关系来表示继承关系。在这种策略中,每一个子类,父类都会单独映射到一张表中。和第 一种策略不同的是,这种策略的表中仅包含类中自己定义的那些属性(不包含继承下来的属性)。为每一个类创建数据库表,表中包含特定于该类的属性和OID。下图显示了该方法,注意personOID作为所有表的主键,它们之间是is-a的关系。primary key person 01DnatneProfessor优点与面向对象的概念的一致性最好-这种策略最大的好处就是关系模型完全标准化,关系模型和 领域模型完全一致。对多态的支持

10、最好,对于对象所可能的充当的角色仅需要在相应的表中保存记录;易于修改基类和增加新的类。缺点数据库中存在大量的表访问数据的时间较长对报表的支持较差,除非定义视图。在关系数据模型中用外键参照关系来表示继承关系。以上每种映射方式都有利有弊,下面介绍每种映射方式的具体实现步骤,同时也还介绍了它们的适用 范围。5、有继承关系的各个子类的构造方法的设计要求在此仅提醒一点,子类的完整构造方法不仅负责初始化子类本身的属性,还应该负责初始化从父类中继承的属性,例如以下是HourlyEmployee类的构造方法:public class HourlyEmployee extends Employee(private double rate;/* 完整构造方法*/public HourlyEmployee(super(name,company);this.rate=rate;/* 默认构造方法*/public HourlyEmployee。(Hibernate只会访问持久化类的默认构造方法,永远不会访问其他形式的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论