Hibernate的继承映射

何为继承映射:

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

继承映射的分类:Hibernate支持三种继承映射策略:

使用 subclass 进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态。(数据看起来会很模糊,因为子类和父类的数据都放在同一张表)

使用 joined-subclass 进行映射:对于继承关系中的子类使用同一个表,这就需要在数据库表中增加额外的区分子类类型的字  段。(子类和父类共有的数据放在父类表,那子类特有的数据放在子类表,但是如果单单看子类表时 是不是无法获得全部数据 吖,)

使用 union-subclass 进行映射:域模型中的每个类映射到一个表,通过关系数据模型中的外键来描述表之间的继承关系。这也    就相当于按照域模型的结构来建立数据库中的表,并通过外键来建立表之间的继承关系。(子类和父类的数据都分别存放在子类和父类的表中,这样存放数据是不是简单明了吖,所以一般推荐使用这个)

但是在实际的开发中,我们一般不推荐使用继承映射,因为表与表之间的关系,不应该那么复杂,这样很难维护

所以我们当做了解知识即可,有时候可能也需要用到

那这种继承映射是怎样实现的呢??(person与student这两者就是继承的关系,以这两个来举例)

I subclass实现

1新建person类和student类

代码如下:

package com.atguigu.hibernate.subclass;

public class person {
private Integer ID;
private String Name;
public Integer getID() {
return ID;
}
public void setID(Integer iD) {
ID = iD;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}

}
student:

package com.atguigu.hibernate.subclass;

public class Student extends person {
private Integer ID;
private String School;
public Integer getID() {
return ID;
}
public void setID(Integer iD) {
ID = iD;
}
public String getSchool() {
return School;
}
public void setSchool(String school) {
School = school;
}

}
1生成父类的.hbm.xml文件,也就是生成person.hbm.xml文件,在这文件中配置discriminator和subclass

代码如下:
    

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-10-9 15:26:08 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>

<class name="com.atguigu.hibernate.subclass.person" table="PERSON" discriminator-value="person">
<!-- 这里这个discrimination-value:代表的是当插入父类时,识别列的值是person-->
<id name="ID" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
    <!-- 这里的discriminator标签的意思是,插入一个识别列,列的数据类型是String-->
<discriminator type="string" column="TYPE" ></discriminator>
<property name="Name" type="java.lang.String">
<column name="NAME" />
</property>

<!-- 映射子类 Student, 使用 subclass 进行映射 -->
<!-- name:指定子类的类名(全类名也可以),discriminationValue是指定插入这个子类时type类型的值, -->
<!-- property的name:子类特有的属性,在父类中列名叫什么 -->

    <!-- 这里这个discrimination-value:代表的是当插入子类时,识别列的值是student-->

<subclass name="com.atguigu.hibernate.subclass.Student" discriminator-value="STUDENT">
<property name="school" type="string" column="SCHOOL"></property>
</subclass>

</class>
</hibernate-mapping>
以上就是subclass的继承映射

II joined-subclass(就是子类与父类相同的字段放在父类,子类特有的字段放在子类,并且子类的主键要根据父类生成)

III union-subclass(子类和父类的字段都分开放,但是主键的生成方式不能使identity,)

时间: 2024-08-24 13:20:39

Hibernate的继承映射的相关文章

hibernate之继承映射

面向对象中有继承的概念,而关系型数据库却没有表与表之间的继承关系.解决思路有三种: 1.  继承关系层次一个表: 含义:使用一个表保存同一继承层次中的所有类,加额外字段来表示所属子类. 优点:多态查询,查询父类和所有子类数据时只需一次简单的查询,性能最佳: 缺点:在数据库表里添加各个区分子类的字段. 适用:需要多态查询,且子类的属性较少. 2.  每个具体类一个表: 含义:父类抽象化不对应一个表,每个子类对应一个表(每个子表包括父和子所有字段). 优点:实现的继承映射最简单. 缺点:多态查询持久

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

单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映射来建表,最后生成的表是这样的: 可以看到我们只需要建立一张表就可以维护这个关系,这种方式就是单表继承映射,下面介绍配置方法: 新建实体类Person ,Student,和Teacher : public class Person { private int id; private String n

hibernate中继承映射保存

1 简单继承映射,在子类上进行映射配置,可以将父类属性直接配置在子类映射文件中. 简单例子如下:teacher类继承自Person类. public class Person { private int id; private String pname; public Person() { // TODO Auto-generated constructor stub } public int getId() { return id; } public void setId(int id) {

hibernate 继承映射

对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持三种继承映射策略: 使用 subclass 进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态. 使用 joined-subclass 进行映射: 对于继承关系中的子类使用同一个表

【SSH快速进阶】——Hibernate继承映射:每棵继承树映射一张表

我们都知道,Hibernate最大的一个优点就是使开发更加"面向对象",类与类之间有继承关系,Hibernate中也对这种继承关系提供了映射的封装. Hibernate为继承映射提供了三种策略 1.每棵继承树使用一张表 2.每个子类使用一张表 3.每个具体类使用一张表 本文对第一种策略进行说明. 场景 如下类图 上图中Pig类和Bird类继承Animal类,每棵继承树对应一张表,即在同一棵继承树中,所有的类的对象信息(记录)共同存放到一张表中,要判断某条记录属于哪个对象,需要在表中添加

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

Hibernate的继承映射可以理解为持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持以下三种继承映射策略: 使用subclass进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态 使用joined-subclass进行映射:对于继承关系中的子类使用同一个表,这就需要在数据库表汇总增加额外的区分子类类型的字段 使用union-

【SSH快速进阶】——Hibernate继承映射:每个具体类映射一张表

上篇文章说的是每个类映射一张表,不管是父类还是子类.与上篇文章不同的是,这里是每个"具体类"映射一张表,什么意思呢?就是让每个子类(具体的.有意义的类)映射一张表. 场景 与上篇文章场景一样,如下类图 上图中Pig类和Bird类继承Animal类,要让每个具体类映射一张表,就是只映射Pig和Bird,如下表所示: (表 1) 上面的表有个特点就是,t_pig和t_bird的主键永远都不会相同.因为表面上看起来这是两张表,但实际上存储的都是动物(同一类型),所以还可以看做是一张表. 配置

Hibernate缓存、组件、继承映射

Hibernate缓存.组件.继承映射 三种状态: 临时状态:不受session管理,没有提交到数据库:没有执行sql之前,new对象的时候: 持久化状态:受session管理,提交到数据库:正在执行sql 游离状态:不受session管理,提交到数据库:session关闭后 Cache缓存:会先看看缓存里有没有,有就取出来,没有就到数据库取数据. Session的三个方法:flush.evict.clear 不同session不会共享数据. List与iterator的区别: List是直接到

一口一口吃掉Hibernate(七)——继承映射

前几篇博文中讲到了常用的几种关联映射.其实hibernate中还有一种"省劲儿"的映射,那就是--"继承映射". 学了这么多的关系映射了,继承映射,从字面上也能了解到猜到几分.没错,继承映射就是为继承树而设置的一种映射方案. 继承映射的实现有三种策略: 单表继承.每棵类继承树使用一个表 类表继承.每个子类生成一个表. 具体表继承.每个类生成一个表. 我们还是用实例来说明一下,直接上图吧: Pig和Bird都继承自Animal,它们都有id,name,sex,但是Pi