java

位置:IT落伍者 >> java >> 浏览文章

精通Hibernate之映射继承关系(一)


发布日期:2023年09月13日
 
精通Hibernate之映射继承关系(一)

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

包含继承关系的域模型

在面向对象的范畴中还存在多态的概念多态建立在继承关系的基础上简单地理解多态是指当一个Java应用变量被声明为Employee类时这个变量实际上既可以引用HourlyEmployee类的实例也可以引用SalariedEmployee类的实例以下这段程序代码就体现了多态

List employees= businessServicefindAllEmployees();Iterator it=erator();while(ithasNext()){Employee e=(Employee)itnext();if(e instanceof HourlyEmployee){Systemoutprintln(egetName()+ +((HourlyEmployee)e)getRate());}elseSystemoutprintln(egetName()+ +((SalariedEmployee)e)getSalary());}

BusinessService类的findAllEmployees()方法通过Hibernate API从数据库中检索出所有Employee对象findAllEmployees()方法返回的集合既包含HourlyEmployee类的实例也包含SalariedEmployee类的实例这种查询被称为多态查询以上程序中变量e被声明为Employee类型它实际上既可能引用HourlyEmployee类的实例也可能引用SalariedEmployee类的实例

此外从Company类到Employee类为多态关联因为Company类的employees集合中可以包含HourlyEmployee类和SalariedEmployee类的实例从Employee类到Company类不是多态关联因为Employee类的company属性只会引用Company类本身的实例数据库表之间并不存在继承关系那么如何把域模型的继承关系映射到关系数据模型中呢?本章将介绍以下三种映射方式

继承关系树的每个具体类对应一个表关系数据模型完全不支持域模型中的继承关系和多态

继承关系树的根类对应一个表对关系数据模型进行非常规设计在数据库表中加入额外的区分子类型的字段通过这种方式可以使关系数据模型支持继承关系和多态

继承关系树的每个类对应一个表在关系数据模型中用外键参照关系来表示继承关系

提示具体类是指非抽象的类具体类可以被实例化HourlyEmployee类和SalariedEmployee类就是具体类

以上每种映射方式都有利有弊本章除了介绍每种映射方式的具体步骤还介绍了它们的适用范围

上一篇:学习比较Struts2和Struts1:Struts2完胜

下一篇:Struts源码研究 - Action-Input属性篇