Hibernate中及继承关系及映射实现

上传人:豆浆 文档编号:19096546 上传时间:2017-11-18 格式:DOC 页数:3 大小:67KB
返回 下载 相关 举报
Hibernate中及继承关系及映射实现_第1页
第1页 / 共3页
Hibernate中及继承关系及映射实现_第2页
第2页 / 共3页
Hibernate中及继承关系及映射实现_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《Hibernate中及继承关系及映射实现》由会员分享,可在线阅读,更多相关《Hibernate中及继承关系及映射实现(3页珍藏版)》请在金锄头文库上搜索。

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

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

3、()Employee oneEmployee =(Employee)it.next();if(oneEmployee instanceof HourlyEmployee)System.out.println(oneEmployee.getName()+ +(HourlyEmployee) oneEmployee).getRate();elseSystem.out.println(oneEmployee.getName()+ +(SalariedEmployee) oneEmployee).getSalary(); 3、多 态 查 询 的 应 用(1)多态查询如果我们 在 BusinessSer

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

5、此外,从 Company 类到 Employee 类为多态关联,因为 Company 类的 employees 集合中可以包含HourlyEmployee 类和 SalariedEmployee 类的实例。从 Employee类到 Company 类不是多态关联,因为 Employee 类的 company属性只会引用 Company 类本身的实例。数据库表之间并不存在继承关系,那么如何把域模型的继承关系映射到关系数据模型中呢4、实现继承关系的三种映射方式在 Hibernate 中对于继承映射到数据表有几种不同的策略,各有适用的不同场合。下面以 Person 基类以及其两个子类Student

6、和 Professor 类为例来说明。(1)每个具体子类映射成单个数据库表-而抽象基类不参与映射-每个具体类一张表Person 由于是抽象类,未映射成数据库表;而Student、Professor 类映射为相应的表,它们具有各自的主键。 优点报表操作实现简单:表中包含了具体子类的所有信息。 缺点类的修改会导致相对应的表及其子类所对应表的更改角色的更改会造成 ID 的重新赋值(因为不同子类的 ID 可能重复)难以在支持多重角色时,保持数据的完整性。这种策略适合在类层次结构上有一定数量的抽象类的情况下使用,同样有两种方式,一种是采用显式多态的方式,另一种是采用隐式多态的方式,显式多态采用的为 hi

7、bernate.union-subclass 的方式,隐式多态则采用每个具体类的 PO 独立建表的策略,在它的映射文件中将看不出任何的和接口、抽象类的关系,同时对于抽象类,需要指明其 abstract=”true” 。关系数据模型完全不支持域模型中的继承关系和多态。(2)将整个类层次映射为单个数据库表-单表策略单表策略很容易理解,就是将基类、各个子类中所有的属性都放至一张表中,这对于子类属性不多的情况非常有效-每个子类代表表中由识别器列(discriminator column)标识的一行。 该方法的优点实现简单;支持多态对象角色发生变化,或存在多重角色时;报表操作实现简单:表中包含了所有信息

8、。 该方法的缺点增加类层次中的耦合,类层次中任何类的属性的增加会导致表的变更如果在某个子类属性的修改错误会影响到整个层次结构,而不仅仅是该子类。浪费了大量的数据库空间;可能需要指明具体的角色。这将失去数据库对 Not Null 的约束,从数据完整性的角度看,问题很严重。对关系数据模型进行非常规设计,在数据库表中加入额外的区分子类型的字段。通过这种方式,可以使关系数据模型支持继承关系和多态。同时在 Hibernate 中通常将子类定义为 的方式来409实现这个策略。(3)每个类均映射为数据库表-继承关系树的每个类对应一个表就是用外键关系来表示继承关系。在这种策略中,每一个子类,父类都会单独映射到

9、一张表中。和第一种策略不同的是,这种策略的表中仅包含类中自己定义的那些属性(不包含继承下来的属性) 。为每一个类创建数据库表,表中包含特定于该类的属性和 OID。下图显示了该方法,注意 personOID作为所有表的主键,它们之间是 is-a 的关系。 优点与面向对象的概念的一致性最好-这种策略最大的好处就是关系模型完全标准化,关系模型和领域模型完全一致。对多态的支持最好,对于对象所可能的充当的角色仅需要在相应的表中保存记录;易于修改基类和增加新的类。 缺点数据库中存在大量的表访问数据的时间较长对报表的支持较差,除非定义视图。在关系数据模型中用外键参照关系来表示继承关系。以上每种映射方式都有利

10、有弊,下面介绍每种映射方式的具体实现步骤,同时也还介绍了它们的适用范围。5、有继承关系的各个子类的构造方法的设计要求在此仅提醒一点,子类的完整构造方法不仅负责初始化子类本身的属性,还应该负责初始化从父类中继承的属性,例如以下是 HourlyEmployee 类的构造方法:public class HourlyEmployee extends Employeeprivate double rate; /* 完 整 构 造 方 法 */public HourlyEmployee(String name, double rate,Company company) super(name,company);this.rate=rate;/* 默 认 构 造 方 法 */public HourlyEmployee() Hibernate 只会访问持久化类的默认构造方法,永远不会访问其他形式的构造方法。提供以上形式的完整构造方法,主要是为 Java 应用的编程提供方便。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 经济/贸易/财会 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号