继承映射分为三种:

  1. 继承结构共用一张表结构
  2. 每个类一张表结构
  3. 每个具体类一张表结构

下面使用Animal、Dog、Fish举例

Animal类如下:

package com.hml.domain.a;

public abstract class Animal {

    private Integer id;
private String name; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }

Dog类如下:

package com.hml.domain.a;

public class Dog extends Animal {

    private float runSpeed;

    public float getRunSpeed() {
return runSpeed;
} public void setRunSpeed(float runSpeed) {
this.runSpeed = runSpeed;
} }

Fish类如下:

package com.hml.domain.a;

public class Fish extends Animal {

    private float swimSpeed;

    public float getSwimSpeed() {
return swimSpeed;
} public void setSwimSpeed(float swimSpeed) {
this.swimSpeed = swimSpeed;
} }

1、继承结构共用一张表

Animal.hbm.xml映射文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hml.domain.a">
<class name="Animal" table="t_animal" discriminator-value="0">
<id name="id">
<generator class="native"></generator>
</id>
<discriminator column="type" type="int"></discriminator>
<property name="name"></property> <subclass name="Dog" discriminator-value="1">
<property name="runSpeed"></property>
</subclass> <subclass name="Fish" discriminator-value="2">
<property name="swimSpeed"></property>
</subclass> </class> </hibernate-mapping>

生成的表结构:

整个继承结构一张表,在映射文件建中通过subclass节点,对子类进行映射。由于整个继承结构一张表,所以在表中需要区分具体是哪个类,所以需要一个鉴别字段,这里通过 discriminator指定,然后在映射类的节点上添加鉴别值,使用这种映射的限制是,子类属性不能有非空约束。

2、每个类一张表

Animal.hbm.xml映射文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hml.domain.a">
<class name="Animal" table="t_animal" >
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property> <joined-subclass name="Dog" table="t_dog">
<key column="id"></key>
<property name="runSpeed"></property>
</joined-subclass> <joined-subclass name="Fish" table="t_fish">
<key column="id"></key>
<property name="swimSpeed"></property>
</joined-subclass> </class> </hibernate-mapping>

生成的表结构如下:

t_animal:

t_dog

t_fish

每个类一张表是通过joined-subclass映射子类,joined-subclass中的key是个外键,在基类中存储基类中的信息,然后每个子类生成的表存储本类中的数据。

3、每个具体类一张表

映射文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hml.domain.a">
<class name="Animal" table="t_animal" abstract="true">
<id name="id">
<generator class="hilo">
<param name="table">hi_value</param>
<param name="column">next_value</param>
<param name="max_lo">100</param>
</generator>
</id>
<property name="name"></property> <union-subclass name="Dog" table="t_dog">
<property name="runSpeed"></property>
</union-subclass> <union-subclass name="Fish" table="t_fish">
<property name="swimSpeed"></property>
</union-subclass> </class> </hibernate-mapping>

每个具体类一张表需要在抽象类上添加abstract="true",不然,抽象了也会生成表的。每个具体类一张表时,主键不能使用自增长,如果使用自增长会报错的。

值得注意的是,继承结构表结构的映射一般不会使用,原因是太复杂,效率低。

Hibernte继承映射的更多相关文章

  1. EF里的继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子

    本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discr ...

  2. 【Hibernate框架】三种继承映射

    一.综述 大家都知道,hibernate作为ORM框架的一个具体实现,最大的一个优点就是是我们的开发更加的能体现出"面向对象"的思想.在面向对象开发中,类与类之间是可以相互继承的( ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (35) ------ 第六章 继承与建模高级应用之TPH继承映射中使用复合条件

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-11  TPH继承映射中使用复合条件 问题 你想使用TPH为一张表建模,建模中使 ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 (36) ------ 第六章 继承与建模高级应用之TPC继承映射

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-12  TPC继承映射建模 问题 你有两张或多张架构和数据类似的表,你想使用TP ...

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

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

  6. 【JavaEE】Hibernate继承映射,不用多态查询只查父表的方法

    几个月前,我在博问里面发了一个问题:http://q.cnblogs.com/q/64900/,但是一直没有找到好的答案,关闭问题以后才自己解决了,在这里分享一下. 首先我重复一下场景,博问里面举的动 ...

  7. Hibernate中的继承映射

    1.继承映射 继承映射分为两种情况:简单继承映射和继承映射. 在简单继承映射中,每个子类都要写一个映射文件. 在继承映射中,只使用一个映射文件.继承映射分为三种情况: 所有子类映射到一张表 需要使用鉴 ...

  8. entity framework里的继承映射关系TPH、TPT和TPC

    本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discr ...

  9. 【Hibernate 5】继承映射配置及多态查询

    一.继承实现的三种策略 1.1,单表继承.每棵类继承树使用一个表(table per class hierarchy) -->本文主要介绍的继承策略 类继承树对应多个类,要把多个类的信息存放在一 ...

随机推荐

  1. 动态input file多文件上传到后台没反应的解决方法!!!

    其实我也不太清除具体是什么原因,但是后面就可以了!!! 我用的是springMVC 自带的文件上传 1.首先肯定是要有springMVC上传文件的相关配置! 2.前端 这是动态input file上传 ...

  2. php--某个字符在字符串中的位置比较

    <?php $haystack = 'helloe'; $needle = 'e'; $pos = stripos($haystack, $needle); echo "\n" ...

  3. 不再写.bat

    <script type="text/javascript"> for (var w = 0; w < 24; w++) { setTimeout(functio ...

  4. IMAP和POP3有什么区别

    http://help.163.com/10/0203/13/5UJONJ4I00753VB8.html?servCode=6010237 IMAP和POP3有什么区别?   POP3协议允许电子邮件 ...

  5. a bitwise operation 广告投放监控

    将随着时间不断增大的数字N个依次编号为1到N的N个球,颜色每次随机为红黑蓝,时间上先后逐个放入篮子中,计算离现在最近的24个球的红.黑.蓝颜色数 广告投放监控 a bitwise operation ...

  6. java FileWriter and FileReader

    import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class FWFRD ...

  7. CSS :before和:after (转)

    前几天的晚上较全面的去看了下css的一些文档和资料,大部分的样式运用都没什么大问题了,只是有些许较陌生,但是也知道他们的存在和实现的是什么样式.今天主要想在这篇学习笔记中写的也不多,主要是针对:bef ...

  8. 变长数组列表ArrayList

    简介:此数据结构定义为一个ArrayList结构体类型,维护了一个内部堆数组.通过realloc函数实现了数组容量自动扩充,每次扩充到原来的2倍. 通过函数指针实现了使用者根据自己的需求按条件按查找目 ...

  9. HBASE的读写以及client API

    一:读写思想 1.系统表 hbase:namespace 存储hbase中所有的namespace的信息 hbase:meta rowkey:hbase中所有表的region的名称 column:re ...

  10. 日志案例分析(PV,UV),以及动态分区

    1.实现的流程 需求分析 时间:日,时段 分区表:两级 PV UV 数据清洗 2015-08-28 18:19:10 字段:id,url,guid,tracktime 数据分析 导出 2.新建源数据库 ...