Hibernate上路_16-继承关系映射

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

例:员工Employee分为正式工SalaryEmployee和临时工HourEmployee。子类表的字段都不能使用非空约束。

1.三种继承关系的建表方式:

1)父类、子类在同一张表,表中有“辨别者列”。通过辨别者列值,区分父类数据和子类数据。
2)父类、子类各一张表。将公共数据放入父表,将个体数据存放子表,子表通过外键关联父表的公共数据。
3)父子类分别建表,父子表无关联,将父类数据存放到父类表,将子类数据存放子类表 ,父子表采用连续增长主键 

2.subClass方式:

父子类数据在同一张表,引入辨别者列(discriminator)用来区分数据记录是父类还是子类。

1)父子类POJO:


2)父类.hbm.xml配置:

对于继承关系映射,不需要为每个类建立hbm文件。只需要针对父类编写hbm即可。

<hibernate-mapping package="cn.cvu.hibernate.domain"><!-- 0.父类、子类都要配置辨别值,将在辨别者列中存储 --><class name="PojoHuman" table="tb_human" select-before-update="true" discriminator-value="human"><id name="id" column="t_id" type="int"><generator class="native" /></id><!-- 1.首先配置辨别者列! column="自定义列名"type="自定义类型"  --><discriminator column="t_disc" type="string"/><!-- 2.然后配置父类的通用属性! --><property name="name" column="t_name" /><!-- 3.最后配置子类关系 name="子类全路径" --><subclass name="cn.cvu.hibernate.domain.PojoWoman" discriminator-value="woman"><!-- 子类的个体属性 --><property name="waistline"/><property name="beauty"/></subclass><subclass name="cn.cvu.hibernate.domain.PojoMan" discriminator-value="man"><property name="height"/><property name="beauty"/></subclass></class>
</hibernate-mapping>


3)作为单表操作:

(1)插入:

public void test(){Session session = UtilGetSession.openSession();Transaction transaction = session.beginTransaction();PojoHuman human = new PojoHuman();human.setName("地球人");PojoWoman woman = new PojoWoman();woman.setName("女人");woman.setWaistline(36);woman.setBeauty("漂亮");PojoMan man = new PojoMan();man.setName("男人");man.setHeight(175);man.setSpeed(12);session.save(human);session.save(woman);session.save(man);transaction.commit();session.close();}

(2)查询,通常使用HQL:

String hqlHuman="from PojoHuman";Query queryHuman = session.createQuery(hqlHuman);List listHuman = queryHuman.list();System.out.println(listHuman);


3.joined-subclass方式:

为每个父类和子类建立单独数据表,将公共数据放入父表, 将个体信息存入子表,子表通过外键与父表关联。

1)类结构相同:

2)父类.hbm.xml配置:

<hibernate-mapping package="cn.cvu.hibernate.domain"><class name="PojoHuman" table="tb_human" select-before-update="true"><id name="id" column="t_id" type="int"><generator class="native" /></id><!-- 父类的通用属性  --><property name="name" column="t_name" /><!-- 子类配置name="子类全路径"table="子类对应的表" --><joined-subclass name="cn.cvu.hibernate.domain.PojoWoman" table="tb_woman"><!-- 子表主键,也是关联父表的外键 --><key column="t_human_child"></key><!-- 子类的个体属性 --><property name="waistline"></property><property name="beauty"></property></joined-subclass><joined-subclass name="cn.cvu.hibernate.domain.PojoMan" table="tb_man"><key column="t_human_child"></key><property name="height"></property><property name="speed"></property></joined-subclass></class>
</hibernate-mapping>


3)测试:

(1)测试保存:
代码同上。

(2)测试查询:
同上。

(3)测试删除: 

PojoHuman human = new PojoHuman();human.setId(2);	//父类托管对象session.delete(human);

org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
WARN: SQL Error: 1451, SQLState: 23000 
org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
ERROR: Cannot delete or update a parent row: a foreign key constraint fails 
(`db_hibernate`.`tb_woman`, CONSTRAINT `FK_8n9ux8k3f9lja8fldi8om7cg0` FOREIGN KEY 
(`t_human_child`) REFERENCES `tb_human` (`t_id`)) 

4.union-subclass方式:

父类和子类单独建表,父表和子表无关联;父类数据插入父表,子类数据插入子表,父表和子表的主键连续自增。

注意:不能使用identity、native,因为需要在多张表完成主键连续自增;可以使用sequence(mysql不支持)、 increment (hibernate实现,max(id)+1)。

1)类结构相同:

2)父类.hbm.xml配置:

<hibernate-mapping package="cn.cvu.hibernate.domain"><class name="PojoHuman" table="tb_human" select-before-update="true"><id name="id" column="t_id" type="int"><generator class="increment" /></id><!-- 父类的通用属性  --><property name="name" column="t_name" /><!-- 子类配置name="子类全路径"table="子类对应的表" --><union-subclass name="cn.cvu.hibernate.domain.PojoMan" table="tb_man"><!-- 子类属性 --><property name="height"/><property name="speed"/></union-subclass><union-subclass name="cn.cvu.hibernate.domain.PojoWoman" table="tb_woman"><property name="waistline"/><property name="beauty"/></union-subclass></class>
</hibernate-mapping>


3)测试:

(1)测试保存:

(2)测试查询:

(3)查询删除:


5.建表原则:

如果父子类数据非常简单,可以使用subclass , 重点推荐joinedsubclass (性能最好),不推荐unionsubclass。

- end
 

转载于:https://my.oschina.net/vigiles/blog/177520

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++起航篇——bool类型,输入输出,命名空间

以下内容源于慕课网http://www.imooc.com/course/list?ccplusplus的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 慕课网学习内容 一、起航 二、离航 三、远征 封装继承多态模板 1、c的新特征 &#xff08;1&#xff09;新数据类型 bool &#xff08;true和fals…

C++离航篇——引用,const

以下内容源于http://www.imooc.com/learn/381的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 一、引用 &#xff08;1&#xff09;引用即定义别名 对引用进行操作即对本身操作&#xff1b;int a10; int &ba; //定义了a的别名b&#xff1b;注意别名是不包括&…

【广搜】棋盘游戏

题目描述 在一个4*4的棋盘上有8个黑棋和8个白棋&#xff0c;当且仅当两个格子有公共边&#xff0c;这两个格子上的棋是相邻的。移动棋子的规则是交换相邻两个棋子。现在给出一个初始棋盘和一个最终棋盘&#xff0c;要求你找出一个最短的移动序列使初始棋盘变为最终棋盘。Klux说…

C++离航篇——函数默认参数、函数重载、内敛函数

1、函数的默认参数 2、函数的重载 &#xff08;1&#xff09;在相同的作用域内&#xff0c;用同一个函数名定义的多个函数&#xff0c;其中每个函数的参数个数、参数类型不同。 3、内联函数 &#xff08;1&#xff09;编译的时候&#xff0c;将函数体代码和相应的实参直接在函…

C++离航篇——内存的申请释放

1、内存的申请和释放 使用关键字new&#xff0c;紧接申请的类型&#xff0c;以及用中括号标明申请多大的内存空间。 2、内存的初始化 注意和块内存申请不同&#xff0c;初始化是&#xff08;&#xff09;&#xff0c;块内存是[ ]。

C++远征之封装篇——类和封装、实例化和对象成员访问

一、封装篇的学习内容数据成员 成员函数构造函数 析构函数对象复制 对象赋值对象数组 对象指针this指针二、类与封装三、实例化和对象成员访问&#xff08;1&#xff09;从栈中实例化对象&#xff08;2&#xff09;从堆中实例化对象 &#xff08;3&#xff09;对象成员的访…

C++远征之封装篇——字符串类型

一、c中的字符串操作函数 二、字符串类型string 1、c中没有字符串类型&#xff0c;只有字符类型 因此对于字符串的操作&#xff0c;一般是用上面的函数来操作。 2、字符串的初始化 3、字符串相关的操作

C++远航之封装篇——数据的封装

以对象为中心&#xff0c;具体来说&#xff0c;以谁做什么来代表程序的逻辑。所有操作都通过调用自己的函数来完成。 数据成员暴露了&#xff0c;不好的设计&#xff1a; 数据的封装&#xff1a;

游戏大厅 从基础开始(7)--绕回来细说聊天室(中间偏下)之女仆编年史2

老少爷们儿反击战 上一篇中 我们的女仆终于可以做一些像阳光下其他人一样的事情了&#xff0c;少爷们可以和女仆酱一起参加下午茶~ 难得的上流社会啊 这是永远1v1被人私有的女奴 和 喝茶时被人共有的女仆酱最明显的差异~ 明媚的午后阳光下&#xff0c;庭院里白色长餐桌两旁&am…

【转载】App.config/Web.config 中特殊字符的处理

写一个网站&#xff0c;遇到一个问题&#xff0c;发布以后&#xff0c;提示错误&#xff0c;但是即使打开错误提示&#xff08;在web.config中打开&#xff09;&#xff0c;还是只提示错误&#xff0c;没提示什么地方错误&#xff0c;这让我知道了&#xff1a;是webconfig本身的…

C++远航之封装篇——类外定义和::

1、类内定义是把函数的具体实现写在类内部&#xff0c;默认是inline函数。 2、类外定义包含两种情况&#xff1a; &#xff08;1&#xff09;同文件类外定义 &#xff08;2&#xff09;不同文件类外定义

pipeline代码自动生成

如图所示&#xff0c;安装完插件后&#xff0c;Sample Step里就有相应的选项&#xff0c;选择某个选项后&#xff0c;点击Generate Pipeline Script按钮&#xff0c;就可以自动生成代码片段&#xff0c;然后放入pipeline流水线里就可以了 pipeline使用的是groovy脚本&#xff0…

一个简单的基于socket的通讯处理程序

2019独角兽企业重金招聘Python工程师标准>>> 这几天看书看得java网络编程&#xff0c;看到一个不错的&#xff0c;适合新手的&#xff0c;部分代码借鉴书上的&#xff0c;可能有地方还不是很成熟&#xff0c;不过可以借鉴一下&#xff0c;分为客户端和服务端&#x…

C++远航之封装篇——构造函数

1、为什么需要构造函数&#xff1f; 见博客http://blog.csdn.net/zhhymh/article/details/6236317 2、c中的内存分区 &#xff08;1&#xff09;栈区 int x0&#xff1b;int *pNULL&#xff1b; &#xff08;2&#xff09;堆区 int *p new int[20]; &#xff08;3&#xff0…

安装win_server_2012的方法

1、从微软官网下载评估版。 2、查看你的当前版本。以管理员身份运行cmd&#xff0c;然后输入“DISM /online /Get-CurrentEdition”。如果是评估版&#xff0c;例如Standard&#xff0c;把“ServerStandardEval”中的Eval这四个字母去掉&#xff0c;就是你的当前版本。下图表明…

DHCP中继处理办法

这两天一直在客户这边测试DHCP&#xff0c;由于客户的网络是现成的server 2008 是后来加上去的&#xff0c;所以没有多的IP地址用于测试&#xff0c;只好拿客户的楼层网段来测试&#xff0c;由于需要跨VLAN实行DHCP地址分配&#xff0c;所有需要做DHCP中继。废话不多说&#xf…

C++远航之封装篇——默认构造函数、初始化列表、拷贝构造函数

1、默认构造函数 没有参数&#xff1b;若有参数&#xff0c;则一定全部都有默认的参数值。 2、初始化列表 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;特性 建议用初始化列表来初始化数据成员。初始化列表先于构造函数执行&#xff1b;初始化列表只能用于构造函…

C++远航之封装篇——析构函数

一、为什么需要析构函数&#xff1f; 见博客&#xff1a;http://blog.csdn.net/zhhymh/article/details/6239832 二、析构函数的理解 1、格式 2、必要性 释放资源。 3、什么时候调用&#xff1f; delet p时会调用析构函数&#xff1b;程序返回时&#xff0c;也会调用析构函数…

生成的数据库脚本没有注释?

1,选择Database->Generate Database 选中Generate name in empty comment就可以了转载于:https://www.cnblogs.com/hongjiumu/archive/2012/08/02/2620379.html

HDU 1312

View Code 1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 以前用BFS写过&#xff0c;这次改用DFS写发现DFS掌握的不好&#xff0c;挑了好久才过&#xff0c;今下午才AC了两道题&#xff0c;还要加紧练习DFS&#xff01;5 int row,col,coun…