Hibernate之继承映射
Hibernate的继承映射可以理解为两个持久化类之间的继承关系 例如老师和人之间的关系
持久化类 Person类
public class Person
{
private Integer id;
privvate String name;
private String sex;
public Person (){} // 无参构造器
public Person(Integer id,String name, String sex) // 带参数的构造器
{
this.id = id;
this.name = name;
this.sex = sex;
}
............. //省略 id属性 name属性 sex属性 的 setter和getter方法
}
持久化 Teacher类
public class Teacher extends Person
{ // 继承了父类的全部Field
private String className; //所带班级名
private String subject; //所教科目名
public Teacher(){} //无参构造器
public Teacher(String id,Sting name ,String sex,String className, String subject)
{
super(id,name,sex); //显示调用父类带三个参数的构造器
this.className = className;
this.subject = subject;
}
........// 继承了父类的getter和 setter方法 省略className属性 subject属性的getter和setter方法
}
有三种方式的继承映射 :
1.采用<subclass>元素的继承映射
在这种映射策略下,持久化父类 和 持久化子类 的实例对应的记录都将保存在一张数据表中。该数据表中额外需要增加一个数据列来记录该行记录是哪个类的实例。
这个列被称为辨别者列(discriminator).
该数据表有父类和所有子类的所有属性所对应的数据列 ,哪个对象实例如果没有该列的属性 ,则这个对象实例的对应记录的这列为null
映射文件配置如下 :
<class name="org.lingtong.pojo.Person" table="tb_person_info" discriminator-value="普通人"> //discriminator-value属性指定该持久化类的对象的辨别值 如果不写默认为全限定类名
<id name="id" column="ID">
<generator class="native"> //指定主键生成器策略
</id>
<discriminator column="FLAG" type="string" /> // 映射辨别列
.... //省略 name属性 sex属性与对应数据列的映射关系
<subclass name="org.lingtong.pojo.Teacher" discriminator-value="老师” /> //discriminator-value属性指定该持久化类的对象的辨别值 如果不写默认为全限定类名
......... //省略 className属性 subject属性与对应数据列的映射关系
//可以继续嵌套子类 但是永远保存在一张表中
</subclass>
</class>
2.采用<joined-subclass>元素的继承映射
采用这种策略 ,父类实例的属性保存在父类表中 ,而子类实例的属性则由父类表和子类表共同存储。将父类和子类共有的属性(即子类通过继承而来的属性)保存在父类表中 ,子类自己扩张增加的属性,则保存在子类表中 。
使用这种映射策略,无需使用辨别者列。但是需要为每个子类表使用<key>元素指定一列去关联父类表的主键列 。<key>元素对应的列 即充当主键又充当外键。
这种关系可以看成“纵向分割映射”
father 类 son类 grandson类
id id id
name name name //则 三个共有属性 形成父类表
sex sex sex
--------------------------------------------------------------
position position //则 两个 子类和孙子类的 共有属性 形成子类表
wife wife //需要指定一列 去关联父类表的主键列 (该列既是主键又是外键)
---------------------------------------------------------------
age //则 两个 由孙子类的 特有属性 形成孙子表
sport //需要指定一列 去关联之类表的主键列 (该列既是主键又是外键)
---------------------------------------------------------------
映射文件配置
<class name="org.lingtong.pojo.Father" table="tb_person_info1" > //discriminator-value属性指定该持久化类的对象的辨别值 如果不写默认为全限定类名
<id name="id" column="ID">
<generator class="native"> //指定主键生成器策略
</id>
.... //省略 name属性 sex属性与对应数据列的映射关系
<joined-subclass name="org.lingtong.pojo.Son" table="tb_person_info2" />
<key column="son_id">
..... // 省略 position属性 与 wife属性与对应数据列的映射关系
<joined-subclass name="org.lingtong.pojo.Son" table="tb_person_info3" />
<key column="grandson_id">
...... // 省略 age属性 与 sport属性与对应数据列的映射关系
</joined-subclass>
</joined-subclass>
</class>
通过这种映射方式形成的数据表
查询孙子类的实例对象对应的记录时 需要跨越三张表
查询子类的实例对象对应的记录时需要跨越两张表
查阅父类的对象实例对应的记录需要一张表
3.采用<union-subclass>元素的继承映射
"横向分割映射"
转载于:https://www.cnblogs.com/wangliyue/p/4151864.html
Hibernate之继承映射相关推荐
- Hibernate读书笔记---继承映射
对于面向对象的程序设计语言,继承.多态是两个最基本的概念.Hibernate的继承映射可以理解两个持久化类之间的继承关系. Hibernate支持几种继承映射策略,不管哪种继承映射策略,Hiberna ...
- hibernate 表关系映射详解之继承关系
举例:亚马逊的网上商城可以卖很多东西,比如说图书,电器,水果等等,那么我们以面向对象的理念去抽象一个商品类,他具有商品的共有属性,比如说上架时间,当前 价格,优惠价格等待,商品可以继承 ...
- 浅析Hibernate映射(三)——继承映射
对象模型示例: 继承映射的实现方式有三种: (一)每棵类继承树一张表 关系模型: 映射文件: <hibernate-mapping package="com.jialin.hibern ...
- Hibernate继承映射
Hibernate继承映射 在面向对象的程序领域中,类与类之间是有继承关系的,例如Java世界中只需要extends关键字就可以确定这两个类的父子关系,但是在关系数据库的世界中,表与表之间没有任何关键 ...
- Hibernate第九篇【组件映射、继承映射】
前言 到目前位置,我们已经学习了一对一.一对多.多对一.多对多映射了-既然Hibernate是ORM实现的框架,它还提供了组件映射和继承映射..本博文主要讲解组件映射和继承映射 Java主要的类主要有 ...
- Hibernate→HQL、query.list()返回数据类型、查询相关语句、分页、原生SQL、@注解、持久化对象状态及生命周期、一多关系、继承映射关系、逆向工程
HQL Query实例与表 session通用工具类 Query对象 from 类→List<类>接收 映射类 仅查询商品 查询商品及所在商家 别名 返回数据类型定义 Iterator接收 ...
- Hibernate4继承映射
Hibernate 支持三种基本的继承映射策略: 1.单表继承:每棵类继承树使用一个表 2.具体表继承:每个子类一个表 3.类表继承:每个具体类一个表(有一些限制) 三种方式的比较: 1.所有类映射成 ...
- 第10 章继承映射(InheritanceMappings)
10.1. 三种策略 Hibernate支持三种基本的继承映射策略: ·每个类分层结构一张表(table per class hierarchy) ·每个子类一张表(table per subclas ...
- NHibernate Inheritance Mapping 继承映射
参考PoEAA,继承的设计模式有:Concrete Table Inheritance(具体表继承).Single Table Inheritance(单表继承).Class Table Inheri ...
最新文章
- sim中do文件/memory(readmemb命令符)/移位编写
- ASP.NET编译执行常见错误及解决方法汇总之一
- 使用宝塔面板部署tp5网站
- 【转】Linux入门命令篇(简训)
- 使用procd执行进程
- MySQL与Python交互入门
- s11.1 lsof:查看进程打开的文件
- 面试官都会问的Mybatis面试题,你会这样回答吗?
- nodejs异步测试_异步过程的自动化测试
- mysql bin值总是变化_MySQL|update字段为相同的值是否会记录binlog
- java bean参数清空_Java互联网架构-Spring IOC底层源码分析
- mysql高级操作_MySQL数据库的高级操作
- 苹果修复被 XCSSET 恶意软件滥用的3个 0day
- c# Point不能输入小数
- 帝国cms+php7.0+mysql_帝国cms切换php7.x登录后台空白解决方法
- springboot-aop
- Java基础系列—字符串
- window10运行不了1stopt_1stopt点击运行没有反应求大佬指点
- C#实现的打飞机游戏(课程设计)
- 华为笔记本电脑home键和end键快捷方式
热门文章
- 浅谈软件自动化集成测试的流程
- Microsoft Web 平台安装程序 (Web PI) Microsoft Web Platform Installer
- Swift - 使用Alamofire通过HTTPS进行网络请求,及证书的使用
- react中ref的使用
- org.apache.ibatis.binding.BindingException: Type interface XXX is not known to the MapperRegistry.
- 阿里员工离职潮的背后?
- IOS初级:UIAlertController
- 122112_1452_Word1
- ubuntu 目录结构
- 正确设置php-fpm和nginx防止网站被黑