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,)

原文地址:https://www.cnblogs.com/jeremy-blog/p/4014326.html