空间管理 您的位置: Linux宝库 » loon » 日志

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

上一篇 / 下一篇  2008-01-15 22:53:54

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

nP)u N*s:Jk$w0Linux宝库 b e`OG7f

Linux宝库 S4nl3|W2b4\w

  图14-1 包含继承关系的域模型

'Hy U,p.U5[o M/qz)C ]0

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

Q;~g oa5n t"g0Linux宝库IX[F{-K'NV

List employees= businessService.findAllEmployees();
8lx0k#G*a{b0Iterator it=employees.iterator();Linux宝库6Q]0Tn R~d
while(it.hasNext()){Linux宝库 Wwf\8zA{'z
Employee e=(Employee)it.next();Linux宝库#ET,zj,|
if(e instanceof HourlyEmployee){Linux宝库L A(hoRY8gG
System.out.println(e.getName()+" "+((HourlyEmployee)e).getRate());Linux宝库(Tc"QM*?
}else
mfz3v)J0A%O y0System.out.println(e.getName()+" "+((SalariedEmployee)e).getSalary());Linux宝库;XE;RH1A9c i,M6Q
}Linux宝库6_ A6x`z(EZ2\e
 

b]XML M/bq4atH}0

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

}}A3p7X*r0

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

Linux宝库/l3ke^R6jJ

  继承关系树的每个具体类对应一个表:关系数据模型完全不支持域模型中的继承关系和多态。Linux宝库IM;^!N(d;{6Iz O4R

Linux宝库X X2WD l1Tt1d/^ EG0TE6@

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

N+hIns^ \0Linux宝库i Gzp+~:w-e

  继承关系树的每个类对应一个表:在关系数据模型中用外键参照关系来表示继承关系。Linux宝库9zH,?Eq?,}

Linux宝库.H&c1uN%F-`-Qz

  提示:具体类是指非抽象的类,具体类可以被实例化。HourlyEmployee类和SalariedEmployee类就是具体类。Linux宝库 C'm,\8@ w8\L

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

C)`X9g_Y `w#a0

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的存档

数据统计

  • 访问量: 6412
  • 日志数: 13
  • 建立时间: 2008-01-15
  • 更新时间: 2008-01-15

RSS订阅

Open Toolbar