【hibernate】映射继承关系
【hibernate】映射继承关系
转载:https://www.cnblogs.com/yangchongxing/p/10405151.html
===========================================
1、每个带有隐式多态的具体类使用一个表
2、每个带有联合的具体类使用一个表
3、每个类层次结构使用一个表
4、每个带有联结的子类使用一个表
===========================================
1、每个带有隐式多态的具体类使用一个表
@MappedSuperclass 超类的属性被忽略不会被持久化
package cn.ycx.study.hibernate.entity;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class BillingDetails {
protected String owner;
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
}
子类
package cn.ycx.study.hibernate.entity; import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class CreditCard extends BillingDetails {
@Id
@GeneratedValue(generator="id_generator")
protected Long id;
protected String cardNumber;
protected String expMonth;
protected String expYear;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getExpMonth() {
return expMonth;
}
public void setExpMonth(String expMonth) {
this.expMonth = expMonth;
}
public String getExpYear() {
return expYear;
}
public void setExpYear(String expYear) {
this.expYear = expYear;
}
}
子类
package cn.ycx.study.hibernate.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class BankAccount extends BillingDetails {
@Id
@GeneratedValue(generator="id_generator")
protected Long id;
protected String account;
protected String bankname;
protected String swift;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getBankname() {
return bankname;
}
public void setBankname(String bankname) {
this.bankname = bankname;
}
public String getSwift() {
return swift;
}
public void setSwift(String swift) {
this.swift = swift;
}
}
生成的 SQL 表结构
CREATE TABLE `creditcard` (
`id` BIGINT(20) NOT NULL,
`owner` VARCHAR(255) NULL DEFAULT NULL,
`cardNumber` VARCHAR(255) NULL DEFAULT NULL,
`expMonth` VARCHAR(255) NULL DEFAULT NULL,
`expYear` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
; CREATE TABLE `bankaccount` (
`id` BIGINT(20) NOT NULL,
`owner` VARCHAR(255) NULL DEFAULT NULL,
`account` VARCHAR(255) NULL DEFAULT NULL,
`bankname` VARCHAR(255) NULL DEFAULT NULL,
`swift` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
2、每个带有联合的具体类使用一个表
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 策略
package cn.ycx.study.hibernate.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class BillingDetails {
@Id
@GeneratedValue(generator="id_generator")
protected Long id;
protected String owner;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
}
子类
package cn.ycx.study.hibernate.entity; import javax.persistence.Entity;
@Entity
public class CreditCard extends BillingDetails {
protected String cardNumber;
protected String expMonth;
protected String expYear;
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getExpMonth() {
return expMonth;
}
public void setExpMonth(String expMonth) {
this.expMonth = expMonth;
}
public String getExpYear() {
return expYear;
}
public void setExpYear(String expYear) {
this.expYear = expYear;
}
}
子类
package cn.ycx.study.hibernate.entity;
import javax.persistence.Entity;
@Entity
public class BankAccount extends BillingDetails {
protected String account;
protected String bankname;
protected String swift;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getBankname() {
return bankname;
}
public void setBankname(String bankname) {
this.bankname = bankname;
}
public String getSwift() {
return swift;
}
public void setSwift(String swift) {
this.swift = swift;
}
}
生成的 SQL 表结构
CREATE TABLE `bankaccount` (
`id` BIGINT(20) NOT NULL,
`owner` VARCHAR(255) NULL DEFAULT NULL,
`account` VARCHAR(255) NULL DEFAULT NULL,
`bankname` VARCHAR(255) NULL DEFAULT NULL,
`swift` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
; CREATE TABLE `creditcard` (
`id` BIGINT(20) NOT NULL,
`owner` VARCHAR(255) NULL DEFAULT NULL,
`cardNumber` VARCHAR(255) NULL DEFAULT NULL,
`expMonth` VARCHAR(255) NULL DEFAULT NULL,
`expYear` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
3、每个类层次结构使用一个表
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 策略
@DiscriminatorColumn(name="bd_type") 指定识别器列名,不指定默认时 DTYPE。
@DiscriminatorValue("CC") 指定识别器值,每种一个,
package cn.ycx.study.hibernate.entity;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="bd_type")
public abstract class BillingDetails {
@Id
@GeneratedValue(generator="id_generator")
protected Long id;
protected String owner;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
}
子类,识别器值 @DiscriminatorValue("CC")
package cn.ycx.study.hibernate.entity; import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue("CC")
public class CreditCard extends BillingDetails {
protected String cardNumber;
protected String expMonth;
protected String expYear;
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getExpMonth() {
return expMonth;
}
public void setExpMonth(String expMonth) {
this.expMonth = expMonth;
}
public String getExpYear() {
return expYear;
}
public void setExpYear(String expYear) {
this.expYear = expYear;
}
}
子类,识别器值 @DiscriminatorValue("BA")
package cn.ycx.study.hibernate.entity;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue("BA")
public class BankAccount extends BillingDetails {
protected String account;
protected String bankname;
protected String swift;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getBankname() {
return bankname;
}
public void setBankname(String bankname) {
this.bankname = bankname;
}
public String getSwift() {
return swift;
}
public void setSwift(String swift) {
this.swift = swift;
}
}
生成的 SQL 表结构
CREATE TABLE `billingdetails` (
`bd_type` VARCHAR(31) NOT NULL,
`id` BIGINT(20) NOT NULL,
`owner` VARCHAR(255) NULL DEFAULT NULL,
`cardNumber` VARCHAR(255) NULL DEFAULT NULL,
`expMonth` VARCHAR(255) NULL DEFAULT NULL,
`expYear` VARCHAR(255) NULL DEFAULT NULL,
`account` VARCHAR(255) NULL DEFAULT NULL,
`bankname` VARCHAR(255) NULL DEFAULT NULL,
`swift` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
4、每个带有联结的子类使用一个表
@Inheritance(strategy=InheritanceType.JOINED) 联结
@PrimaryKeyJoinColumn(name = "ba_id") 可以不指定,它会自动继承父类主键。
package cn.ycx.study.hibernate.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class BillingDetails {
@Id
@GeneratedValue(generator="id_generator")
protected Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
} protected String owner;
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
}
子类
package cn.ycx.study.hibernate.entity; import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
@Entity
@PrimaryKeyJoinColumn(name = "cc_id")
public class CreditCard extends BillingDetails {
protected String cardNumber;
protected String expMonth;
protected String expYear; public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getExpMonth() {
return expMonth;
}
public void setExpMonth(String expMonth) {
this.expMonth = expMonth;
}
public String getExpYear() {
return expYear;
}
public void setExpYear(String expYear) {
this.expYear = expYear;
}
}
子类
package cn.ycx.study.hibernate.entity;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
@Entity
@PrimaryKeyJoinColumn(name = "ba_id")
public class BankAccount extends BillingDetails {
protected String account;
protected String bankname;
protected String swift;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getBankname() {
return bankname;
}
public void setBankname(String bankname) {
this.bankname = bankname;
}
public String getSwift() {
return swift;
}
public void setSwift(String swift) {
this.swift = swift;
}
}
【hibernate】映射继承关系的更多相关文章
- [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
1.继承映射 举例:对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一 ...
- Hibernate(十一):映射继承关系的三种方案
背景: 在一些项目中,会采用集成的关系来定义数据库实体类,比如:人(Person)与学生(Student),学生来源与人,所以人的基本属性学生也拥有:但学生有的一些属性,人就不具有.人与学生之间很显然 ...
- 【SSH系列】Hibernate映射 -- 继承映射
开篇前言 在前面的博文中,小编介绍了hibernate中的映射,一对一,一对多,多对多,单向,双向等,今天这篇博文,小编主要来介绍一下hibernate中的继承映射,小伙伴都知道在C#中,如果想要实现 ...
- Hebernate -- 映射继承关系
1. Employee 为基类, 派生出HourEmployee 和 SalaryEmployee两个类. 采用 subclass 元素的继承映射(1) 采用 subclass 的继承映射可以实现对于 ...
- hibernate映射-继承映射
对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate的继承映射可以理解成持久化类之间的继承关系.例如:人和学生之间的关系.学生继承人,可以认为学生是一个特殊的人,如果对人进 ...
- Entity Framework Code First 映射继承关系
转载 http://www.th7.cn/Program/net/201301/122153.shtml Code First如何处理类之间的继承关系.Entity Framework Code Fi ...
- hibernate 映射组成关系
建立域模型和关系数据模型有着不同的出发点: 域模型: 由程序代码组成, 通过细化持久化类的的粒度可提高代码的可重用性, 简化编程 在没有数据冗余的情况下, 应该尽可能降低表的数目, 简化表之间的參照关 ...
- Hibernate逍遥游记-第10章 映射继承关系-003继承关系树中的每个类对应一个表(joined-subclass)
1. 2. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...
随机推荐
- nyoj 168-房间安排 (贪心)
168-房间安排 内存限制:64MB 时间限制:3000ms 特判: No 通过数:33 提交数:71 难度:2 题目描述: 2010年上海世界博览会(Expo2010),是第41届世界博览会.于20 ...
- VueJS学习之Vue-cli项目模板
1. 首先是学习vue时需要依赖于node.js和webpack打包工具,具体的安装如下 http://nodejs.cn/download/下载安装nodejs,具体的安装步骤不在此赘述 2. 安装 ...
- flexpaper跨服务器访问swf不显示问题
在项目中使用flexpaper.html在线预览时,发现文件存放在本地localhost能访问,在服务器上的无法访问,通常报错“loadswf() is not defined” 研究发现是跨域问题导 ...
- 微服务中的Kafka与Micronaut
今天,我们将通过Apache Kafka主题构建一些彼此异步通信的微服务.我们使用Micronaut框架,它为与Kafka集成提供专门的库.让我们简要介绍一下示例系统的体系结构.我们有四个微型服务:订 ...
- beta week 2/2 Scrum立会报告+燃尽图 01
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9954 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 ...
- 【Luogu 3275】[SCOI2011]糖果
Luogu P3275 显然是一道经典的差分约束系统 相关知识可以查看:[Luogu 1993]差分约束系统问题--小K的农场 值得注意的是这题使用最长路更合适,因为每一个人都要取得至少一个糖果.在添 ...
- 23种GoF设计模式概述
23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...
- Spring Data Jpa的四种查询方式
一.调用接口的方式 1.基本介绍 通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口 public interface UserDao extends JpaR ...
- insertBefore()
insertBefore()方法将把一个给定的节点插入到一个给定元素节点的给定子节点前面,他返回一个指向新增子节点的引用指针: reference = element.insertBefore(new ...
- 【Android - 控件】之V - Toolbar的使用
Toolbar是Android V7包中的一个控件,用来代替Action Bar作为界面的头部标题栏布局.Toolbar相对于Action Bar的特点是更加灵活,可以显示在任何位置. 首先先来看To ...