上篇主要讲述了[hibernate的对象关系映射](http://blog.csdn.net/lovesummerforever/article/details/20901011)。本篇讲述对象继承关系是如何映射具体的表。
对于继承类映射到表有三种方式:
1、一棵继承树映射一张表。
2、每个子类各自映射表。
3、继承树的每个类各自映射表。
### 1、一棵继承树一张表。
直接上图,如下图所示。
![](https://box.kancloud.cn/2016-06-21_576908bd3c71f.jpg)
映射文件代码如下所示。
~~~
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="Animal" table="t_animal" lazy="false">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type" type="string">
</discriminator>
<property name="name"/>
<property name="sex"/>
<subclass name="Pig" discriminator-value="P">
<property name="weight"/>
</subclass>
<subclass name="Bird" discriminator-value="B">
<property name="height"/>
</subclass>
</class>
</hibernate-mapping>
~~~
### 2、每个子类一张表。
![](https://box.kancloud.cn/2016-06-21_576908f94d034.jpg)
映射文件代码如下所示。
~~~
<!--加上package,所以不用写完整了.-->
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="Animal" table="t_animal" abstract="true">
<id name="id">
<generator class="assigned"/>
</id>
<property name="name"/>
<property name="sex"/>
<union-subclass name="Pig" table="t_pig">
<property name="weight"/>
</union-subclass>
<union-subclass name="Bird" table="t_bird">
<property name="height"/>
</union-subclass>
</class>
</hibernate-mapping>
~~~
### 3、每个类一张表(子类+父类)
![](https://box.kancloud.cn/2016-06-21_576908f9661c0.jpg)
代码如下所示。
~~~
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="Animal" table="t_animal" lazy="false">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="sex"/>
<joined-subclass name="Pig" table="t_pig">
<!-- 将会在pig表中加上一个pid -->
<key column="pid"/>
<property name="weight"/>
</joined-subclass>
<joined-subclass name="Bird" table="t_bird">
<!-- 将会在pig表中加上一个pid -->
<key column="bid"/>
<property name="height"/>
</joined-subclass>
</class>
</hibernate-mapping>
~~~
以上三种策略,各有优缺点:
单表继承。查询速度最快,效率高,但是存在冗余字段。
类表继承。层次清楚,无冗余;但是如果使用自增主键方式会产生重复主键。需要使用手动分配主键。
具体表继承。层次最明了,这是优点,也是缺点,而且数据操作效率不高!
- 前言
- Struts旅程(一)Struts简介和原理
- struts旅程(二)Struts登录示例
- Struts旅程(三)Struts表单处理器ActionForm(静态动态)
- Struts旅程(四)MVC向struts MVC框架演变过程
- Struts旅程(五)struts控制器DispatchAction
- Struts旅程(六)Struts页面转发控制ActionForward和ActionMapping
- Hibernate旅程(一)Hibernate架构概述
- Hibernate旅程(二)Hibernate实例
- Hibernate旅程(三)Hibernate持久化对象的三个状态
- Hibernate旅程(四)Hibernate对数据库删除、查找、更新操作
- Hibernate旅程(五)Hibernate映射--基本类映射和对象关系映射
- Hibernate旅程(六)Hibernate映射--继承映射
- Hibernate旅程(七)Hibernate缓存机制--一级缓存
- Hibernate旅程(八)Hibernate缓存机制--二级缓存
- Hibernate旅程(九)Hibernate缓存机制--查询缓存
- Spring旅程(一)为什么使用Spring
- Spring旅程(二)非Spring向Spring过渡-- Spring IOC容器的使用
- Spring旅程(三) AOP--Spring AOP容器基础
- Spring旅程(四) AOP--Spring AOP实例
- SSH旅程(五)Spring运用到Hibernate中
- SSH旅程(六)Spring和struts结合(方案一)