服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

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


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

  
图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());
  }else
  system.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类就是具体类。
  
  以上每种映射方式都有利有弊,本章除了介绍每种映射方式的具体步骤,还介绍了它们的适用范围。

扫描关注微信公众号