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

例:员工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

Hibernate上路_16-继承关系映射相关推荐

  1. hibernate继承关系映射方法(一)--共享一张表

    对于如下关系: Person.java package com.hust.PO;public class Person {private Integer id;private String name; ...

  2. java继承 映射_hibernate继承关系映射和java反射机制的运用

    转:http://blog.csdn.net/derpvailzhangfan/article/details/1957946 ,感谢博主分享 Notes:hibernate元数据的运用:uuid的概 ...

  3. hibernate继承关系映射方法(三)--每个具体类一张表TPC

    TPC:所谓是"每个具体类一张表(table per concrete class)"的意思是:使继承体系中每一个子类都对应数据库中的一张表.每一个子类对应的数据库表都包含了父类的 ...

  4. hibernate继承关系映射关系方法(二)--每个子类一张表

    TPS:所谓"每个子类一张表(Table Per Subclass)":父类一张表,每个子类一张表,父类的表保存公共有信息,子类的表只保存自己特有的信息 这种策略是使用<jo ...

  5. (经典)Hibernate的一对多关系映射(三)

    一对多关系是表提出来的概念,两张表之间会存在这种,前提是有外键关联. 例如:省份和城市 如果设计类,怎样描述省份和城市之间的一对多关系 省份类里包含多个城市对象,使用 Set集合来描述 城市类里包含一 ...

  6. 【大话Hibernate】Hibernate两种实体关系映射详解

    实体类与数据库之间存在某种映射关系,Hibernate依据这种映射关系完成数据的存取,因此映射关系的配置在Hibernate中是最关键的.Hibernate支持xml配置文件与@注解配置两种方式.xm ...

  7. hibernate中多对多关系映射时的xml文件

    2019独角兽企业重金招聘Python工程师标准>>> <?xml version="1.0" encoding="UTF-8"?> ...

  8. Hibernate学习(3) (继承映射,配置文件和注解版)

    这篇blog准备写怎样在Hibernate中反应内存对象之间的继承关系.我们知道,内存对象之间是可以有继承关系的,但是在数据库中,我们继承神马的都是浮云,不存在的.那么怎么办呢?Hibernate提供 ...

  9. hibernate 表关系映射详解之继承关系

    举例:亚马逊的网上商城可以卖很多东西,比如说图书,电器,水果等等,那么我们以面向对象的理念去抽象一个商品类,他具有商品的共有属性,比如说上架时间,当前         价格,优惠价格等待,商品可以继承 ...

最新文章

  1. 易语言 精易模块 操作json数据
  2. DCMTK:简单存储服务类提供者
  3. 另一种无法enable ABAP source code tool的原因
  4. delphi xe4 ini文件不能读取的解决方法
  5. python图像质量评价_OpenCV图像质量评价的SSIM算法(图像相似度)
  6. 【第四篇章-android平台MediaCodec】推断是否支持硬件解码码
  7. char添加一个字符_LINUX字符设备驱动模型分析(起始篇)
  8. 蓝桥杯 入门训练 Fibonacci数列
  9. 我国三大常用坐标系区别(北京54、西安80和WGS-84)
  10. 网课题库接口搭建步骤
  11. html发短信模版,短信模板管理.html
  12. 什么是低代码平台 low-code?
  13. DDR3学习总结(二)
  14. Android 音视频开发相关知识
  15. 2013年5月电商网站微博发展报告
  16. Selenium.Chrome相关配置及用法
  17. Kubernetes新近kubectl及CNI漏洞修复,Rancher 2.2.1发布
  18. 人大金仓受邀参加《航天七〇六“我与航天电脑有约”全国合作伙伴大会》
  19. Windows11使用Edge访问IE页面
  20. 浙大美女开源的算法,真有你的

热门文章

  1. system函数的返回值和执行脚本的返回值
  2. 深度学习(06)-- Network in Network(NIN)
  3. 图论与java_算法笔记_150:图论之双连通及桥的应用(Java)
  4. dedecms怎么改php版本_玩转Termux:手把手教你在手机上安装php与nginx!
  5. 上传 jar 包到 nexus3、上传本地 jar 包到 maven 私服
  6. jquery checkbox 选中、改变状态、change 和 click 事件
  7. DUBBO 使用问题记录
  8. 《重构-改善既有代码的设计》-第1例:租赁影片(1)
  9. FreeSql (十八)导航属性
  10. 深入了解RabbitMQ工作原理及简单使用