前几篇博文中讲到了常用的几种关联映射。其实hibernate中还有一种“省劲儿”的映射,那就是——“继承映射”。

学了这么多的关系映射了,继承映射,从字面上也能了解到猜到几分。没错,继承映射就是为继承树而设置的一种映射方案。

继承映射的实现有三种策略:

  • 单表继承。每棵类继承树使用一个表
  • 类表继承。每个子类生成一个表。
  • 具体表继承。每个类生成一个表。

我们还是用实例来说明一下,直接上图吧:

Pig和Bird都继承自Animal,它们都有id,name,sex,但是Pig主要看weight,而Bird主要看height,此时如果把这些数据存入到数据库中,可以有3种方案,正好对应3种策略。

①. 只生成一个table,对应的继承映射策略是“单表继承”。如图:

②. 每个类生成一个table,对应的继承策略是“类表继承”。如图:

③. 生成3张表,对应的策略是“具体表继承”。如图:

相信大家更愿意看代码,那就用代码说一下吧:

  1. public class Animals {
  2. private int id;
  3. private String name;
  4. private boolean sex;
  5. //此处省略get,set方法
  6. }
  7. public class Bird extends Animals {
  8. private int height;
  9. //此处省略get,set方法
  10. }
  11. public class Pig extends Animals {
  12. private int weight;
  13. //此处省略get,set方法
  14. }

第一种对应的映射文件:使用discriminator和subclass标签

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.bjpowernode.hibernate">
  6. <class name="Animals" table="t_animals" lazy="false">
  7. <id name="id">
  8. <generator class="native"/>
  9. </id>
  10. <discriminator column="type" type="string"></discriminator>
  11. <property name="name"/>
  12. <property name="sex"></property>
  13. <subclass name="Pig"  discriminator-value="P">
  14. <property name="weight"></property>
  15. </subclass>
  16. <subclass name="Bird" discriminator-value="B">
  17. <property name="height"></property>
  18. </subclass>
  19. </class>
  20. </hibernate-mapping>

discriminator,英文解释是“辨别器”。它是用于设置辨别数据的字段,放在id下面,同时使用subclass来配置不同的类,设置discriminator-value,来辨别不同的数据。

第二种映射文件:使用union-subclass标签

  1. <span style="font-size:18px"><?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.bjpowernode.hibernate">
  6. <class name="Animals" table="t_animals" abstract="true">
  7. <id name="id">
  8. <!-- 不能使用native,因为自增会出现两个表一样的id -->
  9. <generator class="assigned"/>
  10. </id>
  11. <property name="name"/>
  12. <property name="sex"/>
  13. <union-subclass name="Pig" table="t_pig">
  14. <property name="weight" />
  15. </union-subclass>
  16. <union-subclass name="Bird" table="t_bird">
  17. <property name="height" />
  18. </union-subclass>
  19. </class>
  20. </hibernate-mapping></span>

第三种映射文件:使用joined-subclass标签

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.bjpowernode.hibernate">
  6. <class name="Animals" table="t_animals" lazy="false">
  7. <id name="id">
  8. <generator class="native"/>
  9. </id>
  10. <property name="name"/>
  11. <property name="sex"/>
  12. <joined-subclass name="Pig" table="t_pig">
  13. <key column="pid" />
  14. <property name="weight" />
  15. </joined-subclass>
  16. <joined-subclass name="Bird" table="t_bird">
  17. <key column="bid" />
  18. <property name="height" />
  19. </joined-subclass>
  20. </class>
  21. </hibernate-mapping>

以上三种策略,各有优缺点:

    • 单表继承。查询速度最快,效率高,但是存在冗余字段。
    • 类表继承。层次清楚,无冗余;但是如果使用自增主键方式会产生重复主键。需要使用手动分配主键。
    • 具体表继承。层次最明了,这是优点,也是缺点,而且数据操作效率不高。

一口一口吃掉Hibernate(七)——继承映射的更多相关文章

  1. hibernate笔记--继承映射关系的三种实现方式

    单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映 ...

  2. Hibernate之继承映射

    1. Hibernate支持三种继承映射策略: –使用 subclass进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态. –使用 j ...

  3. 初识Hibernate之继承映射

         前面的两篇文章中,我们介绍了两张表之间的各种相互关联映射关系,但往往我们也会遇到两张表甚至多张表之间共有着多个相同的字段.例如: 如图,student表和teacher表共同具有id,nam ...

  4. Hibernate的继承映射

    对象模型示例: 继承映射的实现方式有以下三种: (一)每棵类继承树一张表 (二)每个类一张表 (三)每个子类一张表 (一)每棵类继承树一张表 关系模型如下: 映射文件如下: <hibernate ...

  5. hibernate中继承映射保存

    1 简单继承映射,在子类上进行映射配置,可以将父类属性直接配置在子类映射文件中. 简单例子如下:teacher类继承自Person类. public class Person { private in ...

  6. Hibernate(七)一对一映射

    一.创建数据库表 --班级表 create table grade ( gid number primary key, --班级ID gname ), --班级名称 gdesc ) --班级介绍 ); ...

  7. hibernate映射-继承映射

    对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate的继承映射可以理解成持久化类之间的继承关系.例如:人和学生之间的关系.学生继承人,可以认为学生是一个特殊的人,如果对人进 ...

  8. Hibernate4.x之映射关系--继承映射

    Hibernate的继承映射可以理解为持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持以下三 ...

  9. 一口一口吃掉Hibernate(五)——一对多单向关联映射

    版权声明:本文为博主原创文章,未经博主允许不得转载.如需转载请声明:[转自 http://blog.csdn.net/xiaoxian8023 ] 在上一篇博客<一口一口吃掉Hibernate( ...

随机推荐

  1. sql优化基础篇

    优化的步骤: 0.先sql运行看看是否真的很慢,注意设置SQL_NO_CACHE 1.where条件单表查,锁定最小返回记录表.这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始 ...

  2. 操作MP3文件的元数据

    参见:http://jingyan.baidu.com/article/03b2f78c4d5eae5ea237aee7.html 一.MP3文件的元数据 一个规则的MP3文件大致含有3个部分: TA ...

  3. Python入门之函数的形式参数与实参/参数的具体使用方法

    本篇目录: 一. 函数参数之形式参数与实参 二. 函数参数的具体使用 #1.位置参数:按照从左到右的顺序定义的参数 位置形参:必选参数 位置实参:按照位置给形参传值 #2.关键字参数:按照key=va ...

  4. POJ-2570 Fiber Network---Floyd+二进制表示集合

    题目链接: https://vjudge.net/problem/POJ-2570 题目大意: 一些公司决定搭建一个更快的网络,称为"光纤网".他们已经在全世界建立了许多站点,这 ...

  5. 关于if后面直接加上参数名,不加条件的用法

    <template> <section> <p v-if="aa">{{aa}}</p> <p v-if="bb&q ...

  6. sumo快速运行简单仿真实例详细教程

    本文旨在让大家快速的了解sumo,并给出运行一个简单的sumo的例子的教程,进而了解基本sumo工程的架构,使大家对该软件产生兴趣并持续学习下去,刚开始学习仿真的确枯燥,项目"跑起来&quo ...

  7. 遗传算法详解(LINGO及MatlabGA工具箱求解实现)

    遗传算法 1.前言 遗传算法是一种基于生物界自然群体遗传进化机制的自适应全局优化概率搜索算法.它与传统算法不同,不依赖梯度信息,而是通过模拟自然进化过程来搜索最优解. 例子:兔子的遗传进化 有人说,现 ...

  8. 0417 jQuery基础知识

    jQuery基础知识 jQuery需要引入一个js文件,并且这个文件在所有js代码之前(包括引入的其他js文件) 基础操作(对比js): 1.找标签: js:document.getElement.. ...

  9. [C#]Google Chrome 书签导出并生成 MHTML 文件

    目的 因为某些原因需要将存放在 Google Chrome 内的书签导出到本地,所幸 Google Chrome 提供了导出书签的功能. 分析 首先在 Google Chrome 浏览器当中输入 ch ...

  10. [LeetCode] Minimum Index Sum of Two Lists 两个表单的最小坐标和

    Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of favorite ...