浅析Hibernate继承关系树的三种映射方式

开发 后端
这里介绍Hibernate继承关系树的根类对应一个表:对关系数据模型进行非常规设计,在数据库表中加入额外的区分子类型的字段。

在向大家详细介绍Hibernate继承关系树的三种映射方式之前,首先让大家了解下Employee类为抽象类,然后全面介绍。

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

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

  1. List employeesbusinessService.findAllEmployees();  
  2. Iterator it=employees.iterator();  
  3. while(it.hasNext()){  
  4. Employee e=(Employee)it.next();  
  5. if(e instanceof HourlyEmployee){  
  6. System.out.println(e.getName()+" "+((HourlyEmployee)e).getRate());  
  7. }else  
  8. System.out.println(e.getName()+" "+((SalariedEmployee)e).getSalary());  
  9. }  

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

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

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

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

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

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

以上每种映射方式都有利有弊,本章只介绍Hibernate继承关系树的三种映射方式。

【编辑推荐】

  1. 简单描述Hibernate单元测试
  2. 概括Hibernate多表关联查询
  3. 浅谈Hibernate Session Factory
  4. 浅析Hibernate加载配置文件
  5. 深入剖析Hibernate核心接口
责任编辑:佚名 来源: 公安部
相关推荐

2009-09-23 13:26:10

Hibernate对象

2011-04-08 11:13:50

CISCO IOS令牌桶双桶

2012-02-02 16:13:29

HibernateJava

2012-05-30 15:03:43

ibmdw

2009-07-02 09:40:14

Hibernate的继

2012-03-21 17:18:41

2009-06-16 14:36:54

Hibernate继承

2012-03-18 21:10:07

2009-09-25 14:20:28

Hibernate继承映射

2009-09-24 11:17:32

Hibernate查询

2009-09-25 15:58:04

Hibernate对象

2009-09-22 14:12:16

Hibernate S

2012-07-17 09:16:16

SpringSSH

2009-09-25 12:59:52

Hibernate映射

2011-03-10 14:19:56

JavaScript

2009-06-02 14:46:26

Hibernate关系映射教程

2009-06-23 10:45:18

Hibernate支持

2020-11-01 17:10:46

异步事件开发前端

2010-03-12 17:52:35

Python输入方式

2009-06-18 14:22:06

Hibernate多对Hibernate
点赞
收藏

51CTO技术栈公众号