web进修之—Hibernate 继承映射(5)
先看三个类的继承关系,Payment是父类,CashPayment和CreditCardPayment是Payment的子类:
- public class Payment {
- protected long id;
- private String amount;
- // setter,getter
- }
- public class CashPayment extends Payment {
- private String cashType;
- // setter,getter
- }
- public class CreditCardPayment extends Payment {
- private String creditCardType;
- // setter,getter
- }
public class Payment {
protected long id;
private String amount;
// setter,getter
}
public class CashPayment extends Payment {
private String cashType;// setter,getter
}
public class CreditCardPayment extends Payment {
private String creditCardType;// setter,getter
}
每个类分层结构一张表
一个父类和他的所有子类共用一张表,父类的id是主键,在数据库中就是这些类的字段都在一张表中。因为对于子类之间来说,子类CraditCardPayment没有子类CashPayment的cashType属性,所以在数据库中的那一列就是NUll,所以映射的时候所有子类的列不能设置not null约束。
每个子类一张表
父类、子类都各有各自的表,子类的表里面只有子类的属性,子类的表通过主键关联到父类的表的主键,相当于子类相对于父类是单向一对一,子类增加一条记录,弗雷跟着增加一条记录。
每个子类对应一张表,但是使用标识(Discriminator)
这样子就可以由父类的记录找到子类的记录。和上面的区别就是在父类的表里面添加了一个标志字段:用来标识是哪一个子类。
混合使用每个类一张表和父子类共用一张表
就是CraditCardPayment单独一张表,CashPayment和父类一张表,也要使用Discriminator。
每个具体类一张表
父类、每个子类对应一张表。子类的表也保存从父类继承来的属性,所有类公用一个id,也就是各个表里面的id是连续的,表之间没有关联关系。这种方式的局限在于,如果一个属性在超类中做了映射,其字段名必须与所有子类表中定义的相同。
每个具体类一张表,使用隐式多态
每个子类一张表,父类没有表,不能直接保存一个父类,也不能保存这种方法的缺陷在于,在 Hibernate 执行多态查询时(polymorphic queries)无法生成带 UNION
的 SQL 语句。
不论使用哪一种方法映射,配置文件都是写在父类Payment的映射文件里面,payment.hbm.xml如下:
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="org.lep.hibernate.model" >
- <class name="Payment" >
- <id name="id" column="payment_id">
- <generator class="increment"/>
- </id>
- <!--父类中的属性-->
- <property name="amount" type="string" column="amount"/>
- <!--所有类共用一张表 start-->
- <!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->
- <!--<discriminator column="payment_type" type="string"></discriminator>-->
- <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
- <!--<!–子类中的属性–>-->
- <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
- <!--</subclass>-->
- <!--<subclass name="CashPayment" discriminator-value="CASH">-->
- <!--<property name="cashType" column="cash_type"></property>-->
- <!--</subclass>-->
- <!--所有类共用一张表 end-->
- <!--每个子类一张表 start-->
- <!--<joined-subclass name="CreditCardPayment">-->
- <!--<key column="payment_id"></key>-->
- <!--<property name="creditCardType" />-->
- <!--</joined-subclass>-->
- <!--<joined-subclass name="CashPayment">-->
- <!--<key column="payment_id"></key>-->
- <!--<property name="cashType" />-->
- <!--</joined-subclass>-->
- <!--每个子类一张表 end-->
- <!--每个子类一张表,使用辨识标志 start-->
- <!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->
- <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
- <!--<!–fetch="select"表示在查询payment的时候,不进行外表链接查询CreditCardPayment–>-->
- <!--<join table="CreditCardPayment" fetch="select">-->
- <!--<key column="payment_id"></key>-->
- <!--<!–子类中的属性–>-->
- <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
- <!--</join>-->
- <!--</subclass>-->
- <!--<subclass name="CashPayment" discriminator-value="CASH">-->
- <!--<join table="CashPayment">-->
- <!--<key column="payment_id"></key>-->
- <!--<!–子类中的属性–>-->
- <!--<property name="cashType" column="cash_type"></property>-->
- <!--</join>-->
- <!--</subclass>-->
- <!--所有类共用一张表,使用辨识标志 end-->
- <!--混合使用每个子类一张表和每个分层结构一张表 start-->
- <!--<discriminator column="PAYMENT_TYPE" type="string"/>-->
- <!--<!–使用每个分层结构一章表–>-->
- <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
- <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
- <!--</subclass>-->
- <!--<!–使用每个子类一张表–>-->
- <!--<subclass name="CashPayment" discriminator-value="CASH">-->
- <!--<join table="CashPayment">-->
- <!--<key column="payment_id"></key>-->
- <!--<!–子类中的属性–>-->
- <!--<property name="cashType" column="cash_type"></property>-->
- <!--</join>-->
- <!--</subclass>-->
- <!--混合使用每个子类一张表和每个分层结构一张表 end-->
- <!--每个具体类一张表 start-->
- <union-subclass name="CreditCardPayment" table="CreditCardPayment">
- <property name="creditCardType" column="credit_cardt_ype"></property>
- </union-subclass>
- <union-subclass name="CashPayment" table="CashPayment">
- <property name="cashType" column="cash_type"></property>
- </union-subclass>
- <!--每个具体类一张表 end-->
- </class>
- <!--每个具体类一张表,使用隐式多态,将父类的属性映射到子类的表里 start-->
- <!--<class name="CreditCardPayment" table="CreditCardPayment">-->
- <!--<id name="id" column="payment_id">-->
- <!--<generator class="increment"/>-->
- <!--</id>-->
- <!--<!–父类中的属性–>-->
- <!--<property name="amount" type="string" column="amount"/>-->
- <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
- <!--</class>-->
- <!--<class name="CashPayment" table="CashPayment">-->
- <!--<id name="id" column="payment_id">-->
- <!--<generator class="increment"/>-->
- <!--</id>-->
- <!--<!–父类中的属性–>-->
- <!--<property name="amount" type="string" column="amount"/>-->
- <!--<property name="cashType" column="cash_type"></property>-->
- <!--</class>-->
- <!--每个具体类一张表,使用隐式多态 end-->
- </hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="org.lep.hibernate.model" >
<class name="Payment" >
<id name="id" column="payment_id">
<generator class="increment"/>
</id>
<!--父类中的属性-->
<property name="amount" type="string" column="amount"/><!--所有类共用一张表 start-->
<!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->
<!--<discriminator column="payment_type" type="string"></discriminator>-->
<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<!–子类中的属性–>-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</subclass>-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</subclass>-->
<!--所有类共用一张表 end--><!--每个子类一张表 start-->
<!--<joined-subclass name="CreditCardPayment">-->
<!--<key column="payment_id"></key>-->
<!--<property name="creditCardType" />-->
<!--</joined-subclass>-->
<!--<joined-subclass name="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--<property name="cashType" />-->
<!--</joined-subclass>-->
<!--每个子类一张表 end--><!--每个子类一张表,使用辨识标志 start-->
<!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->
<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<!–fetch="select"表示在查询payment的时候,不进行外表链接查询CreditCardPayment–>-->
<!--<join table="CreditCardPayment" fetch="select">-->
<!--<key column="payment_id"></key>-->
<!--<!–子类中的属性–>-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</join>--><!--</subclass>-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<join table="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--<!–子类中的属性–>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</join>--><!--</subclass>-->
<!--所有类共用一张表,使用辨识标志 end--><!--混合使用每个子类一张表和每个分层结构一张表 start-->
<!--<discriminator column="PAYMENT_TYPE" type="string"/>-->
<!--<!–使用每个分层结构一章表–>-->
<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</subclass>-->
<!--<!–使用每个子类一张表–>-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<join table="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--<!–子类中的属性–>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</join>--><!--</subclass>-->
<!--混合使用每个子类一张表和每个分层结构一张表 end--><!--每个具体类一张表 start-->
<union-subclass name="CreditCardPayment" table="CreditCardPayment">
<property name="creditCardType" column="credit_cardt_ype"></property>
</union-subclass>
<union-subclass name="CashPayment" table="CashPayment">
<property name="cashType" column="cash_type"></property>
</union-subclass>
<!--每个具体类一张表 end-->
</class><!--每个具体类一张表,使用隐式多态,将父类的属性映射到子类的表里 start-->
<!--<class name="CreditCardPayment" table="CreditCardPayment">-->
<!--<id name="id" column="payment_id">-->
<!--<generator class="increment"/>-->
<!--</id>-->
<!--<!–父类中的属性–>-->
<!--<property name="amount" type="string" column="amount"/>-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</class>-->
<!--<class name="CashPayment" table="CashPayment">-->
<!--<id name="id" column="payment_id">-->
<!--<generator class="increment"/>-->
<!--</id>-->
<!--<!–父类中的属性–>-->
<!--<property name="amount" type="string" column="amount"/>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</class>-->
<!--每个具体类一张表,使用隐式多态 end-->
</hibernate-mapping>
web进修之—Hibernate 继承映射(5)的更多相关文章
- web进修之—Hibernate 关系映射(3)
概述 Hibernate的关系映射是Hibernate使用的难点或者是重点(别担心,不考试哦~),按照不同的分类方式可以对这些映射关系做一个分类,如: 按对象对应关系分: 一对一 多对一/一对多 多对 ...
- web进修之—Hibernate起步(1)(2)
想开始写博客了,尝试了CSDN和cnblog之后还是觉得cnblog更加简洁.专注(不过cnblog不支持搬家),所以把刚刚写的两篇学习博客链接放在这儿,这样这个系列也算是完整了: web进修之—Hi ...
- 【JavaEE】Hibernate继承映射,不用多态查询只查父表的方法
几个月前,我在博问里面发了一个问题:http://q.cnblogs.com/q/64900/,但是一直没有找到好的答案,关闭问题以后才自己解决了,在这里分享一下. 首先我重复一下场景,博问里面举的动 ...
- hibernate 继承映射关系( SINGLE_TABLE)
三种继承映射关系. 1,SINGLE_TABLE person student teacher 在一个表中,student和teacher继承自person,通过一个Discriminato ...
- Hibernate继承映射(@Inheritance)
继承映射在 Annotation 中使用 @Inheritance 注解,并且需要使用 strategy 属性指定继承策略,继承策略有 SINGLE_TABLE.TABLE_PER_CLASS 和 J ...
- SSH开发实践part3:hibernate继承映射
0 大家好.上次讲了关于hibernate中双向1-N的映射配置,可以参考:http://www.cnblogs.com/souvenir/p/3784510.html 实际项目中,对象间的关系比较复 ...
- Hibernate继承映射
在面向对象的程序领域中,类与类之间是有继承关系的,例如Java世界中只需要extends关键字就可以确定这两个类的父子关系,但是在关系数据库的世界中,表与表之间没有任何关键字可以明确指明这两张表的父子 ...
- web进修之—Hibernate 类型(4)
本片包含Hibernate的两种类型的简单介绍和集合类型的映射. Hibernate中的两种类型: Entity 自己掌控自己的生命周期,比如Person有addrss属性(关联到另外一张表).age ...
- web进修之—Hibernate HQL(7)
概述 HQL是Hibernate封装成为面向对象的数据库查询语言,具有如下特点: 面向对象,包括继承.多态和关联之类的概念,SQL操作的数据库的表,HQL更像是操作对象 大小写敏感,只对对象和属性敏感 ...
随机推荐
- Libgdx slg游戏进程记录
2月16日缩放居中,stage确定点击坐标,背景处理为actor 2月17日地图多次点击 2月19日stage确定点击位置(贝塞尔曲线六边形) 2月24日格式长度,读取xml属性解析btl保存 3月1 ...
- centos 6.5升级openssl
1.下载升级版本 wget https://www.openssl.org/source/openssl-1.1.0i.tar.gz 2.安装 zlib zlib-devel yum -y insta ...
- virtualenv搭建
1.准备工作 终端 网络状况良好 2.安装虚拟环境 如何安装虚拟环境: 2.1了解你的电脑中有哪些版本的python whereis python 查看当前系统中有多少跟python有关的命令 ...
- Thread,ThreadPool,Task
线程分为前台和后台.比如我们直接new一个Thread这就是前台线程. 前台线程一定会执行. 比如我们创建2个线程:1号,2号,同时执行,假设1号是主线程,1执行完了,依旧会等待2执行完成,整个程序才 ...
- gitlab 之 升级、迁移
-----故事背景- 公司服务器用vm装的虚拟机,由于公司服务器经常无故重启,且找不到原因,所以公司准备将vm迁移至Hyper-V,Hyper-V可以自启动虚拟机且免费. -----升级.迁移- 首先 ...
- 基础项目构建,引入web模块,完成一个简单的RESTful API 转载来自翟永超
简介 在您第一次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复粘贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot ...
- EF学习笔记(八):更新关联数据
学习笔记主目录链接:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇链接:EF学习笔记(七):读取关联数据 本篇原文链接:Updating Related Data 本篇主要考 ...
- 几个简单的windows API
//将光标移动到x,y位置void gotoxy(int x, int y){ COORD c; c.X = x; c.Y = y; SetConsoleCursorPosition(GetStdHa ...
- Javascript高级编程学习笔记(53)—— DOM2和DOM3(5)遍历
遍历 “DOM2级遍历和范围” 定义了两个用于辅助完成顺序遍历的DOM结构类型 NodeIterator 和 TreeWalk 上述两种类型可以基于给定起点的DOM结构执行深度优先的遍历操作 对于检测 ...
- Linux 下 安装Python第三方模块工具箱pip,以及用pip安装的方法
下载文件 wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 执行安装 python get-pip.py 可以做一个软连 ...