本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7591501
建立时间:2006年5月29日




[Hibernate]精通Hibernate映射继承关系之一 
软件技术

lhwork 发表于 2006/12/22 17:10:44

在域模型中,类与类之间除了关联关系和聚集关系,还可以存在继承关系,在图14-1所示的域模型中,Company类和Employee类之间为一对多的 双向关联关系(假定不允许雇员同时在多个公司兼职),Employee类为抽象类,因此它不能被实例化,它有两个具体的子类: HourlyEmployee类和SalariedEmployee类。由于Java只允许一个类最多有一个直接的父类,因此Employee类、 HourlyEmployee类和SalariedEmployee类构成了一棵继承关系树。 500)this.width=500'> 图14-1 包含继承关系的域模型在面向对象的范畴中,还存在多态的概念,多态建立在继承关系的基础 上。简单地理解,多态是指当一个Java应用变量被声明为Employee类时,这个变量实际上既可以引用HourlyEmployee类的实例,也可以 引用SalariedEmployee类的实例。以下这段程序代码就体现了多态: List employees= businessService.findAllEmployees();Iterator it=employees.iterator();while(it.hasNext()){Employee e=(Employee)it.next();if(e instanceof HourlyEmployee){System.out.println(e.getName()+" "+((HourlyEmployee)e).getRate());}elseSystem.out.println(e.getName()+" "+((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类就是具体类。以上每种映射方式都有利有弊,本章除了介绍每种映射方式的具体步骤,还介绍了它们的适用范围。


阅读全文(1809) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.297 second(s), page refreshed 144774237 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号