Hibernate @OneToMany 及 @Cascade级联操作
点击上方 好好学java ,选择 星标 公众号
重磅资讯、干货,第一时间送达
今日推荐:团队开发中的 Git 实践个人原创+1博客:点击前往,查看更多
作者:潘佳琦
链接:https://segmentfault.com/a/1190000021857759
前言
由图中可以看出实体间关系:一对多(@OneToMany
)
在实际开发场景中,删除员工老板不会被删除,老板被删除了员工肯定要删除
由此,就会使用级联操作,在一对多关系中,@Cascade
属性(级联)只设置“一”的一方即可,外键由“多”的一方进行维护。
@ManyToOne和@OneToMany 注解
ManyToOne
(多对一)单向:不产生中间表,但可以用@Joincolumn(name=" ")
来指定生成外键的名字,外键在多的一方表中产生。OneToMany
(一对多)单向:会产生中间表,此时可以用@onetoMany
@Joincolumn(name=" ")
避免产生中间表,并且指定了外键的名字(别看@joincolumn
在一中写着,但它存在在多的那个表中)OneToMany
,ManyToOne
双向(两个注解一起用的):如果不在@OneToMany
中加mappedy
属性就会产生中间表。
cascade属性:指定级联操作的行为(可多选)
CascadeType.PERSIST:级联新增(又称级联保存):对A对象保存时也会对B对象进行保存。并且,只有A类新增时,会级联B对象新增。若B对象在数据库存在则抛异常。对应
EntityManager
的presist
方法。CascadeType.MERGE:级联合并(级联更新):指A类新增或者变化,会级联B对象(新增或者变化)。对应
EntityManager
的merge
方法。CascadeType.REMOVE:级联删除:只有A类删除时,会级联删除B类,即在设置的那一端进行删除时,另一端才会级联删除。对应
EntityManager
的remove
方法。CascadeType.REFRESH:级联刷新:获取A对象时也重新获取最新的B对象。对
EntityManager
的refresh(object)
方法。即会重新查询数据库里的最新数据(用的比较少)CascadeType.DETACH:级联分离。
CascadeType.ALL:级联所有操作。
示例(以级联保存及删除为例)
Boss老板实体:
@Entity
public class Boss {@Id @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@OneToMany(mappedBy = "boss")private List<Staff> staffList;
}
Staff员工实体:
@Entity
public class Staff {@Id @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@ManyToOne private Boss boss;
}
不添加任何级联
执行save
保存操作,结果如下
老板表:
员工表:
执行的SQL:
insert into boss (name) values ('张老板')
PERSIST:级联新增(又称级联保存)
@OneToMany(mappedBy = "boss", cascade = CascadeType.PERSIST)
private List<Staff> staffList;
执行save
保存操作,结果如下
老板表:
员工表:
★
员工已经级联保存,但是员工表中的
boss_id
却是空,可见级联是直接将set
中的对象持久化到数据库,而并没有对关系进行维护(需要手动去维护)。”
执行的SQL:
★
insert into boss (name) values ('张老板') insert into staff (boss_id, name) values (1, '员工一') insert into staff (boss_id, name) values (1, '员工二')
”
直接在数据库中执行SQL关系是维护好的
REMOVE:级联删除
@OneToMany(mappedBy = "boss", cascade = CascadeType.REMOVE)
private List<Staff> staffList;
执行delete
保存操作,结果如下
老板表:
员工表:
执行的SQL
select boss0_.id as id1_0_0_, boss0_.name as name2_0_0_ from boss boss0_ where boss0_.id=1select stafflist0_.boss_id as boss_id3_2_0_, stafflist0_.id as id1_2_0_, stafflist0_.id as id1_2_1_, stafflist0_.boss_id as boss_id3_2_1_, stafflist0_.name as name2_2_1_ from staff stafflist0_ where stafflist0_.boss_id=1delete from staff where id=1
delete from staff where id=2
delete from boss where id=1
★
老板表该条记录删除,同时员工表中的记录也被级联删除。
”
代码
https://github.com/panjiaqi1/Demo
Hibernate @OneToMany 及 @Cascade级联操作相关推荐
- Hibernate一对多关联映射及cascade级联操作
我们以客户(Customer)与订单(Order)为例 实体类创建 Order订单实体类 //订单-----多的一方 public class Order {private Integer id;pr ...
- Hibernate的Cascade——级联操作
在Hibernate中,针对持久化实体的配置文件中有Cascade这样一个属性,顾名思义就是级联,也就是说在操作当 前实体时,针对当前实体的操作会影响到相应配置的关联实体.比如针对当前实体进行保存操作 ...
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
- 详细理解java Hibernate 或 JPA的级联操作
2019独角兽企业重金招聘Python工程师标准>>> 先占个坑,一会儿来补 转载于:https://my.oschina.net/shichangcheng/blog/780496
- mysql表的级联操作_mysql表之间的关系及级联操作
表之间的关系 foreign key 外键约束,用于指向另一个表的主键字段 # 创建表的时候添加外键 create table teacher( id int primary key auto_inc ...
- Hiberate 级联操作(cascade,many-to-one,one-to-many,many-to-many)
使用的数据 建表语句 CREATE DATABASE Hibernate02; USE Hibernate02; CREATE TABLE `cut_customer`( `cust_id` bigi ...
- Hibernate级联操作 注解
EJB3 支持的操作类型 /*** Cascade types (can override default EJB3 cascades*/ public enum CascadeType {ALL,P ...
- hibernate级联操作详解
2019独角兽企业重金招聘Python工程师标准>>> 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) l Casade用来 ...
- Hibernate学习-14:实体之间的关系及其配置,级联操作
1.实体之间有三种关系: * 一对多: * 一个用户,生成多个订单,每一个订单只能属于一个用户. * 建表原则: * 在多的一方创建一个字段,作为外键,指向一的一方的主键. * 多对多: * 一个学生 ...
最新文章
- python用pil图像放大缩小_python使用PIL缩放网络图片并保存的方法
- 如何使用ABAP代码反序列化JSON字符串成ABAP结构
- [正则表达式] 可以解析HTML/XHTML页面的所有元素和结构的Regular Expression![ZT]
- 调试信息清除小工具的编写
- 20145228 《信息安全系统设计基础》第九周学习总结 (2)
- python2.3嵌套if结构:
- Asterisk 11 chan_sip.c: Failed to authenticate device 看不到IP的问题
- 史上最全的Maven Pom文件标签详解
- cmd编译java代码
- Navicat 注册机破解问题
- Echarts柱状图配置
- excel冻结窗口怎么设置_Win7电脑窗口颜色怎么设置成护眼色?简单几步就能搞定...
- 智慧城市 宠物管理系统的重要性 --“遛狗不牵绳-违法”
- 计算机专业排名2014,2014计算机考研院校排名
- 计算机基础知识是一级吗,计算机二级和初级的区别 初级是一级吗
- 最简单的,安装flash插件
- twitch.tv 聊天特殊表情符号
- css-边框重叠问题解决
- flexbuilder 开发工具
- JavaScript实现N个视频的切换
热门文章
- ASP.NET MVC Tip #31: 给 Master Pages 和 User Controls 传递数据
- 让每次编译产生的目标文件都能打印出编译时间信息
- 文本挖掘预处理流程总结(1)— 中文
- 机器学习+算法考试有感 2019 山东大学
- JavaScript流程控制之分支结构
- 【python】排序算法的稳定性冒泡排序(画图详细讲解)
- 用_beginthreadex不用 CreateThread
- MFC C++ 获取外网IP地址
- linux dev_info,Linux命令集-xfs_info
- linux编译llvm代码