继承映射分为三种:

  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. [杂谈]交通工具orca card

    How and Where to Use the ORCA Card The Microsoft ORCA card provides unlimited rides on all buses, tr ...

  2. slf4j提示Class path contains multiple SLF4J bindings

    报错: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding .jar!/org/slf4j/impl/St ...

  3. Sublime Text初识

    一 基础安装1. 安装Package Control使用快捷键ctrl+`,调出输出窗口, 然后输入官网提供的代码, 获取代码地址:https://packagecontrol.io/installa ...

  4. C++ 常用术语(后续补充)

    内存对齐常量折叠 堆栈解退(stack unwinding) 模板特化模板偏特化 模板实例化 函数对象 单一定义规则(One-Definition Rule,ODR) 自引用   对象切片(objec ...

  5. font awesome

    http://stackoverflow.com/questions/21406538/how-to-use-font-awesome-icons-from-node-modules

  6. os

    内核,Shell和文件结构一起形成了基本的操作系统结构. from:大学生攻克Linux系统教程(又名天下没有难学的Linux) 发问: 0-内核,再怎么分出层次呢?

  7. P1970 花匠

    状态定义是dp中非常重要的,可以直接影响到效率,如此题,第一种思路是: #include <bits/stdc++.h> using namespace std; const int ma ...

  8. 运维技能大全 | Devops Tools 周期表

    老外整理的 Devops Tools 周期表,可以用酷炫屌炸天形容,划分了数据库.CI.日志.安全.监控.配置管理.云服务等15个大类,120个工具.我是有点孤陋寡闻,很多都没听说过,你要是全学会了你 ...

  9. UBUNTU 14.04 安装 OPENCV 2.4.9

    1.  从OpenCV.org 下载源代码 opencv-2.4.9.zip 2. 解压到准备好的目录 unzip opencv-2.4.9.zip 3. 进入源码目录,创建release目录 cd ...

  10. 查看特性Attribute数据

    加载程序集 Assembly loAssembly = Assembly.Load( lcAssembly ) ;    Type[ ] laTypes = loAssembly.GetTypes(  ...