Hibernate继承映射

精通Hibernate之映射继承关系(三) 这种映射方式只需为继承关系树的Employee根类创建一张表EMPLOYEES。如图14-4所示,在EMPLOYEES表中不仅提供和Employee类的属性对应的字段,还要提供和它的两个子类的所有属型对应的字段,此外,EMPLOYEES表中需要额外加入一个字符串类型的EMPLOYEE_TYPE字段,用于区分Employee的具体类型。图14-4继承关系树的根类对应一个表Company类和Employee类有相应的映射文件,而HourlyEmployee类和SalariedEmployee类没有相应的映射文件。图14-5显示了持久化类、映射文件和数据库表之间的对应关系。图14-5持久化类、映射文 立即下载

面向对象的程序领域中,类与类之间是有继承关系的,例如Java世界中只需要extends关键字就可以确定这两个类的父子关系,但是在关系数据库的世界中,表与表之间没有任何关键字可以明确指明这两张表的父子关系,表与表是没有继承关系这样的说法的。为了将程序领域中的继承关系反映到数据中,Hibernate为我们提供了3中方案:

第一种方案:一个子类对应一张表。

第二种方案:使用一张表表示所有继承体系下的类的属性的并集。

第三种方案:每个子类使用一张表只存储它特有的属性,然后与父类所对应的表以一对一主键关联的方式关联起来。

现在假设有People、Student、Teacher三个类,父类为People,Student与Teacher为People的父类,代码如下:

People类:

public class People
{
    /*父类所拥有的属性*/
    private String id;
    private String name;
    private String sex;
    private String age;
    private Timestamp birthday;
    
    /*get和set方法*/
}

Student类:

public class Student extends People
{
    /*学生独有的属性*/
    private String cardId;//学号


    public String getCardId()
    {
        return cardId;
    }


    public void setCardId(String cardId)
    {
        this.cardId = cardId;
    }
}

Teacher类:

复制代码
public class Teacher extends People
{
/*Teacher所独有的属性*/
private int salary;//工资

public int getSalary()
{
return salary;
}

public void setSalary(int salary)
{
this.salary = salary;
}
}
复制代码


第一种方案:一个子类对应一张表 

该方案是使继承体系中每一个子类都对应数据库中的一张表。示意图如下:

 

  每一个子类对应的数据库表都包含了父类的信息,并且包含了自己独有的属性。每个子类对应一张表,而且这个表的信息是完备的,即包含了所有从父类继承下来的属性映射的字段。这种策略是使用<union-subclass>标签来定义子类的。

配置People.hbm.xml文件:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="com.suxiaolei.hibernate.pojos.People" abstract="true">
<id name="id" type="string">
<column name="id"></column>
<generator class="uuid"></generator>
</id>

<property name="name" column="name" type="string"></property>
<property name="sex" column="sex" type="string"></property>
<property name="age" column="age" type="string"></property>
<property name="birthday" column="birthday" type="timestamp"></property>

<!--
<union-subclass name="com.suxiaolei.hibernate.pojos.Student" table="student">
<property name="cardId" column="cardId" type="string"></property>
</union-subclass>
<union-subclass name="com.suxiaolei.hibernate.pojos.Teacher" table="teacher">
<property name="salary" column="salary" type="integer"></property>
</union-subclass>

-->

</class>
<union-subclass name="com.suxiaolei.hibernate.pojos.Student"
table
="student" extends="com.suxiaolei.hibernate.pojos.People">
<property name="cardId" column="cardId" type="string"></property>
</union-subclass>

<union-subclass name="com.suxiaolei.hibernate.pojos.Teacher"
table
="teacher" extends="com.suxiaolei.hibernate.pojos.People">
<property name="salary" column="salary" type="integer"></property>
</union-subclass>
</hibernate-mapping>
复制代码

  以上配置是一个子类一张表方案的配置,<union-subclass>标签是用于指示出该hbm文件所表示的类的子类,如People类有两个子类,就需要两个<union-subclass>标签以此类推。<union-subclass>标签的"name"属性用于指定子类的全限定名称,"table"属性用于指定该子类对应的表的名称,"extends"属性用于指定该子类的父类,注意该属性与<union-subclass>标签的位置有关,若 <union-subclass>标签作为<class>标签的子标签,则"extends"属性可以不设置,否则需要明确设置"extends"属性。<class>标签中的"abstract"属性如果值为true则,不会生成表结构。如果值为false则会生成表结构,但是不会插入数据。

根据People.hbm.xml生成表结构:

复制代码
   drop table if exists student
drop table if exists teacher

create table student (
id varchar(255) not null,
name varchar(255),
sex varchar(255),
age varchar(255),
birthday datetime,
cardId varchar(255),
primary key (id)
)

create table teacher (
id varchar(255) not null,
name varchar(255),
sex varchar(255),
age varchar(255),
birthday datetime,
salary integer,
primary key (id)
)
复制代码

可以看到一个子类对应一张表。


第二种方案:使用一张表表示所有继承体系下的类的属性的并集

  这种策略是使用<subclass>标签来实现的。因为类继承体系下会有许多个子类,要把多个类的信息存放在一张表中,必须有某种机制来区分哪些记录是属于哪个类的。Hibernate中的这种机制就是,在表中添加一个字段,用这个字段的值来进行区分。在表中添加这个标示列使用<discriminator>标签来实现。

该策略的示意图:

 

将继承体系中的所有类信息表示在同一张表中后,只要是这个类没有的属性会被自动赋上null。

配置People.hbm.xml:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="com.suxiaolei.hibernate.pojos.People" table="people">
<id name="id" type="string">
<column name="id"></column>
<generator class="uuid"></generator>
</id>

<discriminator column="peopleType" type="string"></discriminator>

<property name="name" column="name" type="string"></property>
<property name="sex" column="sex" type="string"></property>
<property name="age" column="age" type="string"></property>
<property name="birthday" column="birthday" type="timestamp"></property>

<subclass name="com.suxiaolei.hibernate.pojos.Student" discriminator-value="student">
<property name="cardId" column="cardId" type="string"></property>
</subclass>

<subclass name="com.suxiaolei.hibernate.pojos.Teacher" discriminator-value="teacher">
<property name="salary" column="salary" type="string"></property>
</subclass>
</class>
</hibernate-mapping>
复制代码

<discriminator>标签用于在表中创建一个标识列,其"column"属性指定标识列的列名,"type"指定了标识列的类型。<subclass>标签用于指定该HBM文件代表类的子类,有多少子类就有多少个该标签,其"name"属性指定子类的名称,"discriminator-value"属性指定该子类的数据的标识列的值是什么,其"extends"属性与<union-subclass>的"extends"属性用法一致。

根据People.hbm.xml生成表结构:

复制代码
    drop table if exists people

create table people (
id varchar(255) not null,
peopleType varchar(255) not null,
name varchar(255),
sex varchar(255),
age varchar(255),
birthday datetime,
cardId varchar(255),
salary varchar(255),
primary key (id)
)
复制代码

可以看到一张表将继承体系下的所有信息都包含了,其中"peopleType"为标识列。

 

第三种方案:每个子类使用一张表只存储它特有的属性,然后与父类所对应的表以一对一主键关联的方式关联起来。

  这种策略是使用<joined-subclass>标签来定义子类的。父类、子类都对应一张数据库表。在父类对应的数据库表中,它存储了所有记录的公共信息,实际上该父类对应的表会包含所有的记录,包括父类和子类的记录;在子类对应的数据库表中,这个表只定义了子类中所特有的属性映射的字段。子类对应的数据表与父类对应的数据表,通过一对一主键关联的方式关联起来。

这种策略的示意图:

 

  people表中存储了子类的所有记录,但只记录了他们共有的信息,而他们独有的信息存储在他们对应的表中,一条记录要获得其独有的信息,要通过people记录的主键到其对应的子表中查找主键值一样的记录然后取出它独有的信息。

配置People.hbm.xml:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="com.suxiaolei.hibernate.pojos.People" table="people">
<id name="id" type="string">
<column name="id"></column>
<generator class="uuid"></generator>
</id>

<property name="name" column="name" type="string"></property>
<property name="sex" column="sex" type="string"></property>
<property name="age" column="age" type="string"></property>
<property name="birthday" column="birthday" type="timestamp"></property>

<joined-subclass name="com.suxiaolei.hibernate.pojos.Student" table="student">
<key column="id"></key>
<property name="cardId" column="cardId" type="string"></property>
</joined-subclass>

<joined-subclass name="com.suxiaolei.hibernate.pojos.Teacher" table="teacher">
<key column="id"></key>
<property name="salary" column="salary" type="integer"></property>
</joined-subclass>
</class>
</hibernate-mapping>
复制代码

<joined-subclass>标签需要包含一个key标签,这个标签指定了子类和父类之间是通过哪个字段来关联的。

根据People.hbm.xml生成表结构:

复制代码
    drop table if exists people
drop table if exists student
drop table if exists teacher

create table people (
id varchar(255) not null,
name varchar(255),
sex varchar(255),
age varchar(255),
birthday datetime,
primary key (id)
)

create table student (
id varchar(255) not null,
cardId varchar(255),
primary key (id)
)

create table teacher (
id varchar(255) not null,
salary integer,
primary key (id)
)

alter table student
add index FK8FFE823BF9D436B1 (id),
add constraint FK8FFE823BF9D436B1
foreign key (id)
references people (id)

alter table teacher
add index FKAA31CBE2F9D436B1 (id),
add constraint FKAA31CBE2F9D436B1
foreign key (id)
references people (id)
复制代码

可以看到,父类对应的表保存公有信息,子类对应的表保存独有信息,子类和父类对应的表使用一对一主键关联的方式关联起来。


J-SCOPE实战:除了看波形,如何用它和JLink-RTT模式高效调试你的STM32变量? 本文详细介绍了如何利用J-SCOPE和JLink-RTT模式高效调试STM32变量,实现实时数据可视化。通过对比HSS和RTT模式的优劣,提供固件端配置、J-SCOPE设置及实战应用案例,帮助开发者快速掌握这一高效调试技术,特别适用于电机控制、传感器融合等需要实时监控的场景。 阅读详情

相关推荐

【一步到位】Android Studio 实现安卓连接阿里云物联网云平台

最新版本目前是Android Studio Iguana | 2024.1.2,你可以到官网上去找之前的版本,手上有工作项目的不要去轻易尝试,说不定你就编译失败了,失败了也不要担心,解决就可以了。

m0_73799445的博客 1万+

hibernate的继承映射

hibernate的继承映射探究

u011526599的专栏 4887

使用WSL2安装ubuntu系统并配置深度学习环境

wsl2安装ubuntu部署深度学习环境的方法

u013358093的博客 2701

Hibernate中的Entity类之间的继承关系之四TABLE_PER_CLASS

对于Hibernate提供的4种兼容JPA的映射策略,这里介绍第四种table-per-concrete-class策略。事实上,从数据库表结构看,这种策略下的每个Entity类都对应一个独立的数据库表。 在这种策略中,存在如下特征: 父子Entity类也对应一个数据库表 父表中无需设置discriminator列 子表中不仅包含子Entity类特有的全部属性,还包括从父Entity类继承...

成长的足迹 4891

2025.06.20【pacbio】|PB甲基化分析结果的统计与可视化介绍

本文介绍了PacBio甲基化数据的统计分析与可视化方法。主要内容包括:1) 分析甲基化位点分布、比例及染色体分布;2) 修饰基序(Motif)的统计与热图展示;3) 全基因组和局部区域测序深度可视化;4) 使用IGV查看单个reads修饰情况。文章提供了R代码示例,涵盖柱状图、分布图、热图等多种可视化形式,并建议了差异甲基化分析等进阶方法,帮助科研人员深入挖掘甲基化数据。

2066

★教程2:fpga学习教程入门100例目录【含程序操作讲解视频】

★基础入门 1.FPGA开发软件安装

FPGA/MATLAB学习教程/源码/项目合作开发 7万+

从零开始 Spring Boot 63:Hibernate 继承映射

关系型数据库设计中是不存在继承概念的,但实体类可以用继承来组织代码结构,所以需要用一种方式将实体类的继承结构映射到表结构。本文将介绍几种在 JPA(Hibernate)中映射实体类继承层次的方式。

梦幻天空 2156

PyTorch生成式人工智能——VQ-VAE详解与实现

VQ-VAE (Vector Quantised-Variational AutoEncoder) 的核心思想就是将 VAE 的连续潜变量离散化。它通过学习一个码本 (Codebook) 来实现这一点,码本是一个包含有限个嵌入向量的字典。模型不是直接输出一个连续的潜在向量,而是从码本中找出与编码器输出最接近的嵌入向量来代替它。本节首先详细讲解 VQ-VAE 的技术原理,然后使用 PyTorch 从零开始实现 VQ-VAE 模型。

盼小辉丶的博客 3281

Hibernate继承关系的实体设计的两种方法

 1 对于父类和子类分别对应数据库中的一个表,父类表中的字段是公共的属性,子类表中是特殊的属性。数据库表:父表: titem 字段:id (id) name (名称) manufacturer (产地)                子表1:ibook 字段:id (id) pagecount(页数)         子表2:idvd  字段:id (id) regioncod

天使 3993

华为昇腾开发——多模型资源管理(C++)

在使用Ascend ACL(Ascend Computing Language)的ACLLite库进行多模型推理时,合理的资源管理至关重要。

如果想成为中心,那么就到中心去吧。 575

MATLAB从入门到精通-APP调用simulink中的参数,并且修改,将结果返回到APP中

本次案例为以下微分方程: 其中方程的初始值为: Step1:搭建simulink文件,如下图所示: 初始值配置在积分模块中,如下图所示: Step2:制作app 操作视频: ,时长01:11 代码: 本文包括APP如何回调simulik中d的参数,以及把simulink中的仿真结果输出到APP中的绘图界面中。 核心代码如下: ...

wenyusuran的专栏 3042

Hibernate继承映射之一_用一张表映射

这次给大家发的是hibernate的继承映射,继承映射的实例有很多:例如dog、cat都是animal的子类 这里用的是文章Article、主题Topic和回复Reply给大家做讲解。

机智猫 1万+

【异常】claude : 无法将“claude”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径

如果claude方式1(临时):使用完整路径运行,比如:# Windows 批处理脚本示例 C:\你的脚本目录\claude . bat # PowerShell 脚本示例 C:\你的脚本目录\claude . ps1方式2(永久):将脚本所在文件夹添加到系统 PATH 环境变量(参考场景1的环境变量配置步骤),之后即可直接输入claude运行。错误核心原因:系统 PATH 环境变量中找不到claude对应的可执行文件/脚本。

奶爸的编程之路,也就一周冷个三天 3669

hibernate映射关系——继承映射

今天这篇博客,说的是hibernate的继承映射。 一、以前使用过继承映射吗?       刚听到继承映射的时候,不知道是怎么一回事。视频看完,哦,原来我使用过。没有学习过ORM之类知识的孩子们,如果是第一次听说,不要担心,你们一定使用过,只是不知道它用过这样一个名称而已。看下面的表:          这样的表结构,是不是很熟悉的。这就是继承映射的一种。     特点:

王勇霞 信息技术提高班九期 1986

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Hibernate继承映射详解

在面向对象的程序领域中,类与类之间是有继承关系的,例如Java世界中只需要extends关键字就可以确定这两个类的父子关系,但是在关系数据库的世界中,表与表之间没有任何关键字可以明确指明这两张表的父子关系,表与表是没有继承关系这样的说法的。为了将程序领域中的继承关系反映到数据中,Hibernate为我们提供了3中方案: 第一种方案:一个子类对应一张表。 第二种方案:使用一张表表示所有继承体系下

鹏霄万里展雄飞 2526

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Hibernate继承关系映射

在关系数据模型中,用外键参照关系来表示继承关系,子类对应的表中存在外键参照父类对应表的主键。继承父类的一些属性,但不用父类作为映射实体时使用注解:@MappedSuperclass。每个子类所对应的表中同时存在从父类继承的属性和自己特有的属性。在表中加入额外的字段区分子类的类型,表中包含父类和所有子类的属性对应的字段。[缺点]:如果要查询父类的对象,必须查询所有具体的子类对应的表。[优点]:如果某个类的属性发生变化,只需要修改该类所对应的表。[缺点]:如果父类的属性发生变化,必须修改所有子类对应的表。

LIUCHANGSHUO的博客 985

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Hibernate的继承映射

对象模型示例: 继承映射的实现方式有以下三种: (一)每棵类继承树一张表 (二)每个类一张表 (三)每个子类一张表 (一)每棵类继承树一张表 关系模型如下: 映射文件如下: &lt;hibernate-mapping package="com.nnngu"&gt; &lt;class name="Animal" table="t_animal" la...

nnngu 294

【Hibernate】——三种继承映射

说到继承关系,相信我们都很熟悉,比如男人类和女人类继承人类。在hibernate继承映射关系中与对象之间的继承也很类似,它有三中实现策略,即单表继承、集体表继承、类表继承。 单表继承    即每棵类继承一张表,描述一个继承关系只用一张表,子类使用的表与父类相同。     优点:有区分子类的字段,也有描述其他字段的字段,子类的属性不能为空,维护方便,只需修改一张表。

你若盛开,清风自来 684

Hibernate继承映射之三_用多张表映射2

【回顾】Hibernate继承映射之一_用一张表映射 【回顾】Hibernate继承映射之二_用多张表映射 这次给大家带来的是继承映射的第二种方法:用多张表映射,每张表都有公共字段! 映射情景回顾以及各实体类在这里就不重复写了,需要的都在:http://blog.youkuaiyun.com/nthack5730/article/details/45366983 【因为除了映射文件改变而已

机智猫 1万+

【hibernate】---- 继承映射

看hibernate视频的时候,老师讲的继承映射非常好,所以就在这里总结一下吧!     继承映射分为三类: 1、单表继承,每一个类继承树使用一张表 2、具体表继承,每个类一个表 3、类表继承,每个具体类一个表 单表继承:    这种策略其实就是把子类的信息和父类的信息共同放到一张表中,那么怎么区分哪个记录是属于哪个类的呢?hibernate用的机制

My Devil's Cry 924

hibernate 继承映射

在域模型中,类与类之间除了关联关系和聚集关系,还可以存在继承关系,在下图所示的域模型中,Deparment类和Employee类之间为一对多的双向关联关系,Employee类有两个子类:Skiller类和Sales类。由于Java只允许一个类最多有一个直接的父类,因此Employee类、 Skiller类和Sales类构成了一棵继承关系树。  在面向对象的范畴中,还存在多态的概念,多态建立在

xyjikl 535

Hibernate之继承映射

我们继续学习Hibenrnate映射中的继承映射。继承的概念大家应该都很熟悉,而它在Hibenrnate中的实现方式总共 有三种:         1.每棵类继承树一张表。        2.每个类一张表。        3.每个具体类一张表。   每棵类继承树一张表   映射文件: <!DOCTYPEhiber

区块链领域填坑的java程序猿 922

hibernate-继承映射

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

F13253524870的博客 212
上一篇: jsp如何获取struts2 action中值(普通属性,domain属性,集合,application,session.....)
下一篇: 多线程間通信
SOMECT
博客等级 码龄15年 11粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值