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,一经查实,立即删除!

相关文章

Android中的AnimationDrawable的使用

首先可以先定义一个逐帧播放的xml&#xff1a; 1 <?xml version"1.0" encoding"utf-8"?>2 <animation-list xmlns:android"http://schemas.android.com/apk/res/android"3 android:oneshot"false" >4 5 <ite…

HttpUtility编码

程序集&#xff1a; system .web HttpUtility.UrlDecode UrlEncode HttpUtility.UrlEncode 方法: 对 URL 字符串进行编码&#xff0c;以便实现从 Web 服务器到客户端的可靠的 HTTP 传输。 转载于:https://www.cnblogs.com/whl4835349/p/11208191.html

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

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

Metasploit没有db_autopwn命令的解决办法

转载自&#xff1a;宁夏网络安全信息平台[http://www.nxfbi.com]未加载前&#xff1a;msf > db_db_connect db_driver db_import db_statusdb_disconnect db_export db_nmap解决办法&#xff1a;将附件db_autopwn.rp 拷贝到/opt/framework3/msf3/plugin…

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

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

msbuild explorer

http://msbuildexplorer.com/转载于:https://www.cnblogs.com/dmdj/p/3439366.html

【广搜】棋盘游戏

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

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

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

POJ——字符串插入

欢迎来我的个人网站&#xff1a;http://www.rxwcv.cn 2:字符串插入 查看提交统计提问总时间限制: 1000ms 内存限制: 65536kB描述有两个字符串str和substr&#xff0c;str的字符个数不超过10&#xff0c;substr的字符个数为3。&#xff08;字符个数不包括字符串结尾处的\0。&…

POJ 1200 Crazy Search(RK)

题意 给定一个由NC个字母组成的字符串&#xff0c;求长度为N的不同子串的个数 思路&#xff1a; 由于只有NC个字母&#xff0c;可以将字母编号&#xff0c;0 &#xff5e; NC - 1&#xff0c;转换成数字&#xff0c;就可以将字符串表示成NC进制的数字&#xff0c;这样所有字串代…

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

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

去掉ExpandableListView的箭头图标

用到ExpandableListView时有个箭头图标系统自带的在你自定义布局也不能去掉只要设置一个属性即可&#xff0c;如下&#xff1a; settingLists.setGroupIndicator(null); ~~~~~~~~~~~~~~~~~此处就是设置自定义的箭头图标的。置空则没有了。 也可以自定义&#xff08;但是位置还…

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

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

[原创]Enterprise Architecture V7.5 C++代码生成时,头文件中函数声明没有注释,CPP中函数定义却有注释。...

这几天一直在用Enterprise Architecture来抽象项目中要用到的一些数据结构和类&#xff0c;然后都做得差不多了之后发现&#xff0c;生成代码的时候.h文件中类成员函数部分没有注释&#xff0c;但是.cpp文件中的函数定义块却有注释&#xff0c;我觉得重点应该是要在头文件的成员…

ios之mknetworkkit笔记

asi没法用了&#xff0c;蛋疼了&#xff0c;在af和mk之间纠结&#xff0c;感觉af不适合我的口味&#xff0c;解析和网络耦合相对似乎重了点 mk似乎默认的不支持下载的断点续传&#xff0c;这里参考网上的代码处理了下&#xff0c;0修改mk的库&#xff0c;下面是实现的代码 // /…

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

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

无需格式转换直接发布DWG图纸到Autodesk Infrastructure Map Server(AIMS) 2013

无需格式转换直接发布DWG图纸到AIMS供Web用户浏览估计是AIMS2013里最激动人心的新功能了&#xff0c;看一下这个视频吧。 英文版&#xff1a; http://docs.autodesk.com/MAP/2013/ENU/map_videos_new_features/Publishing%20DWG%20files.html 中文版&#xff1a; http://docs.a…

分词相关技术(转载)

最近在做问答系统&#xff0c;自己在园子里面找了下资料&#xff0c;觉得不错&#xff0c;自己是菜鸟原创不行&#xff0c;废话不多说了&#xff0c;送上资料。 第一个是关于Lucene的分词技术 这里可以下载PDF看&#xff0c;Lucene 原理与代码分析完整版 目录如下&#xff1a;…

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

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

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

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