JPA级联操作详解——级联删除(CascadeType.REMOVE)

Hibernate级联删除:这颗“炸弹”你敢用吗?一不小心全删光! 摘要: Hibernate的级联删除(Cascade Delete)能自动清理关联数据,但滥用可能导致数据灾难。本文解析其底层机制(如CascadeType.REMOVE与inverse属性),对比不同配置的删除行为(直接删除子表记录 vs 外键置NULL),并通过代码案例揭示风险。关键避坑点:避免在many-to-one端级联删除,优先使用on delete set null或delete-orphan策略,结合事务确保数据安全。级联删除是“可控的毁灭”,需谨慎权衡自动化与数据完整性。 (字数:150) 阅读详情



Garage.java

package com.hibernate.jpa.bean1;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Garage {

	/**
	 * many to one 多对一
	 */
	private Integer gid;
	private String garagenum;
	private Set<Auto> autos = new HashSet<Auto>();
	
	@Id @GeneratedValue
	public Integer getGid() {
		return gid;
	}
	public void setGid(Integer gid) {
		this.gid = gid;
	}
	@Column(length=20)
	public String getGaragenum() {
		return garagenum;
	}
	public void setGaragenum(String garagenum) {
		this.garagenum = garagenum;
	}
	@OneToMany(cascade={CascadeType.PERSIST},mappedBy="garage")
	public Set<Auto> getAutos() {
		return autos;
	}
	public void setAutos(Set<Auto> autos) {
		this.autos = autos;
	}
	public void addGarageAuto(Auto auto) {
		auto.setGarage(this);
		this.autos.add(auto);
	}

}

Auto.java

package com.hibernate.jpa.bean1;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Auto {

	/**
	 * one to many 一对多关联
	 */
	private Integer autoId;
	private String autotype;
	private String autonum;
	private Garage garage;

	@Id @GeneratedValue
	public Integer getAutoId() {
		return autoId;
	}
	public void setAutoId(Integer autoId) {
		this.autoId = autoId;
	}
	public String getAutotype() {
		return autotype;
	}
	public void setAutotype(String autotype) {
		this.autotype = autotype;
	}
	public String getAutonum() {
		return autonum;
	}
	public void setAutonum(String autonum) {
		this.autonum = autonum;
	}
	@ManyToOne()
	@JoinColumn(name="garageid")
	public Garage getGarage() {
		return garage;
	}
	public void setGarage(Garage garage) {
		this.garage = garage;
	}

}

持久化数据

mysql> select * from garage;
+-----+-----------+
| gid | garagenum |
+-----+-----------+
| 1 | room1 |
| 2 | room2 |
| 3 | room3 |
+-----+-----------+

mysql> select * from auto;
+--------+---------+----------+----------+
| autoId | autonum | autotype | garageid |
+--------+---------+----------+----------+
| 1 | hk2222 | car | 1 |
| 2 | bj0000 | car | 1 |
| 3 | jn1d31 | bus | 3 |
| 4 | sh3243 | car | 3 |
+--------+---------+----------+----------+

junit测试方法delete()

	@Test public void delete() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-hibernate");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Garage garage = em.find(Garage.class, 3);
		em.remove(garage);
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

调用delete方法是myeclipse控制台出现异常

javax.persistence.RollbackException: Error while commiting the transaction

Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`itcast/auto`, CONSTRAINT `FK1F51CFA8A25FB2` FOREIGN KEY (`garageid`) REFERENCES `garage` (`gid`))

发出的sql语句是:

Hibernate: select garage0_.gid as gid1_0_, garage0_.garagenum as garagenum1_0_ from Garage garage0_ where garage0_.gid=?

二)在Garage.java中添加CascadeType.REMOVE注解

	@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE},mappedBy="garage")
	public Set<Auto> getAutos() {
		return autos;
	}

此时再次调用junit单元测试的delete方法

测试显示成功,发出的sql语句为

Hibernate: select garage0_.gid as gid1_0_, garage0_.garagenum as garagenum1_0_ from Garage garage0_ where garage0_.gid=?
Hibernate: select autos0_.garageid as garageid1_, autos0_.autoId as autoId1_, autos0_.autoId as autoId0_0_, autos0_.autonum as autonum0_0_, autos0_.autotype as autotype0_0_, autos0_.garageid as garageid0_0_ from Auto autos0_ where autos0_.garageid=?
Hibernate: delete from Auto where autoId=?
Hibernate: delete from Auto where autoId=?
Hibernate: delete from Garage where gid=?

此时表garage中的gid为3的字段被全部删除,同时也级联删除了与garage相关联表auto中garageid为3的字段

Sql代码 复制代码 收藏代码
  1. mysql> select * from garage;
  2. +-----+-----------+
  3. | gid | garagenum |
  4. +-----+-----------+
  5. | 1 | room1 |
  6. | 2 | room2 |
  7. +-----+-----------+
mysql> select * from garage;
+-----+-----------+
| gid | garagenum |
+-----+-----------+
|   1 | room1     |
|   2 | room2     |
+-----+-----------+

Sql代码 复制代码 收藏代码
  1. mysql> select * from auto;
  2. +--------+---------+----------+----------+
  3. | autoId | autonum | autotype | garageid |
  4. +--------+---------+----------+----------+
  5. | 1 | hk2222 | car | 1 |
  6. | 2 | bj0000 | car | 1 |
  7. +--------+---------+----------+----------+
mysql> select * from auto;
+--------+---------+----------+----------+
| autoId | autonum | autotype | garageid |
+--------+---------+----------+----------+
|      1 | hk2222  | car      |        1 |
|      2 | bj0000  | car      |        1 |
+--------+---------+----------+----------+

怎么样,这下级联删除也明白了吧?



01. VBA从入门到精通——录制宏、窗口、快捷键 excel表功能区右击→常用→选择显示开发工具选项→确定Visual Basic:打开VBA窗口宏:查看要录制的宏录制宏:准备录制宏使用相对引用:录制宏的时候对单元格的引用做一个设置宏安全性:对宏的使用做安全设置,一般设置为禁用所有宏,并发出通知,此时打开带有宏代码的工作薄时会出现警告标记,如果宏可信就选择启动。 阅读详情

相关推荐

STM32基于软件模拟IIC进行AHT21B温湿度采集

通过学习软件IIC来进行实操AHT21B采集温湿度。

Liu-FE的博客 3700

jpa级联操作详解2--级联删除(CascadeType.REMOVE)

aad Garage.java package com.hibernate.jpa.bean1; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persiste...

sefcertyu 495

CCS安装教程图解说明:可视化步骤快速上手

通过清晰的图解步骤详解CCS安装过程,帮助新手快速掌握环境搭建。结合ccs安装教程与实际操作界面,每一步都直观易懂,大幅降低学习门槛,提升配置效率。

weixin_42611310的博客 960

JPA级联操作保存、删除、更新

springboot+JPA级联操作很简单,只需在实体类加入相对应注解即可!CascadeType有多种模式,可以点击去进入底层看下解释。只需在@OneToMany注解中加入相应参数即可。级联保存需要在实体类初始化字段。

qq_33550166的博客 2062

基于51单片机的智能灌溉系统

基于51单片机的智能灌溉系统

jiejiezuishuai的博客 2100

MTK PE+2.0介绍

  PE+2.0介绍:   1.      PE+2.0的状态机: 2.      升压波形协议及编码规则: PE+2.0软件设计:   在充电器类型为标充且底层电量SOC在1%—95%之间时,开始PE+2.0升压充电器的检测:首先将VBUSreset至5V,之后发送8.5的current pattern再获取此时VBUS电压和8.5V比较,若其与8.5的差值绝对值在0.5之...

raydom07的博客 1万+

java 级联删除_JPA级联删除

本篇文章帮大家学习JPA级联删除,包含了JPA级联删除使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 -@OneToOne(cascade=CascadeType.REMOVE)JPA级联删除示例在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执...

weixin_39878247的博客 816

2D Nesting Defining a CSV File of Part Data

若。

qq_36560674的博客 1834

jpa级联操作详解3--级联删除(2)(CascadeType.REMOVE)

在上一讲中jpa级联操作详解2 Garage.java中有一个CascadeType.REMOVE注解,是在删除garage表中数据的时候级联删除auto表中的数据;这次我们研究在Auto中有一个CascadeType.REMOVE注解时,在删除auto表中的数据的时候能否级联删除garage表中的数据 (一)不在Auto.java添加CascadeType.REMOVE注解时 数据库中的数据如

u013036792的专栏 4183

基于深度学习的柑橘病害检测系统——YOLOv8 + UI界面 + 数据集

深度学习是机器学习的一种重要分支,它通过构建多层的神经网络(尤其是卷积神经网络CNN)来从大规模的数据中学习特征。近年来,深度学习特别是在计算机视觉领域取得了显著的进展,成为图像分类、目标检测、图像分割等任务的主要技术。对于农业病害检测问题,深度学习通过对大量带标签的病害图像进行训练,能够自动识别不同类型的病害,并判断病害的程度。通过图像中目标(病害区域)的边界框,可以快速定位病害区域,进一步分析其影响范围。

YOLO 1042

AD9613操作控制

输出250M时钟给AD9613,过FPGA ILA逻辑分析仪将AD9613采集的两个通道ADC数据250M数据显示出来。其中AD9613输出的是LVDS数据,通过select IO核转为并行数据。 一,搜索IP核:selectIO interface wizad ,并双击配置 配置为input,DDR模式,数据位宽为12bit,IO类型为差分,这里配置的是12对数据差分对。然后配置外部差分时钟。 将tap setting 设置为13,将时钟的边沿对准数据的中间,以免数据出错 二,

wangjie36的博客 4047

jpa级联操作详解3-级联删除(2)(cascadetype.remove)-sefcertyu-iteye技术网站

jpa级联操作详解3-级联删除(2)(cascadetype.remove)-sefcertyu-iteye技术网站 2011年07月01日   在上一讲中jpa级联操作详解2 Garage.java中有一个CascadeType.REMOVE注解,是在删除garage表中数据的时候级联删除auto表中的数据;这次我们研究在Auto中有一个CascadeType.REMOVE注解时,在删...

air18air 194

Spring AI Alibaba 项目源码学习(九)-其他继承BaseAgent

本文分析了Spring AI Alibaba Agent Framework中的A2aRemoteAgent实现,主要特点包括: 实现了Agent间的远程调用能力,支持分布式部署 核心组件包括AgentCard封装元数据、A2aNodeActionWithConfig处理调用逻辑、AgentCardProvider提供卡片管理 支持流式调用和状态共享机制 采用Builder模式构建Agent实例 通过指令传递实现Agent间通信 关键流程包括状态提取、请求构建、远程调用和状态更新四个步骤,形成Agent

819

JPA概念解析:CascadeType(各种级联操作)详解

CascadeType.PERSIST 官方文档的说明:Cascade persist operation 看到网上很多博客对这一枚举值的解释是:级联持久化(保存)操作(持久保存拥有方实体时,也会持久保存该实体的所有相关数据。) 我的内心OS是:妈蛋。我也知道是级联persist操作啊关键是怎么操作啊。妈蛋。拥有方实体是个什么玩意儿,该实体又是个什么玩意儿。 经过实践检验,我的理解是:给当...

史大姐的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jpa OneToMany级联操作详解之级联删除

下面给出了一个级联删除的demo,其中Garage与Auto是一个一对多的关系。 在级联删除的关键地方,就是在父栏添加CascadeType.REMOVE标注。 Garage.java /**   * many to one 一对多关联  */ Java代码  package com.jpa.bean1;    import java.util.HashSet;   i

eddle的专栏 3万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Eclipselink Jpa之级联删除(@OneToOne(cascade = CascadeType.REMOVE))

技术: idea + Eclipselink Jpa + mysql8.0.13 + lombok 正文: package com.atsico.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Acce...

weixin_44428051的博客 1551

JPA 级联操作 CascadeType

JPA的级联操作 CascadeType 级联操作是jpa表关联关系注解 OneToOne OnTOMany ManyToOne ManyTOMany 中配置的属性,代表本身对关联的实体拥有的操作权限; JPA的级联配置项4种 ALL: 所有级联操作 PERSIST: 级联保存 MERGE: 级联更新 REMOVE: 级联删除 REFRESH: 级联刷新 DETACH: 级联托管/游离操作 为更方便的理解这里假设 用户表:User部门表:Dept 角色表中引用User对象的实体 1.CascadeT

Asparrow的博客 909

Spring Boot Jpa之CascadeType

Spring Boot Jpa之CascadeTypeJPA允许您传播从父实体到子级的状态转换。为此,JPA javax.persistence.CascadeType定义了各种级联类型:ALL 级联所有实体状态转换PERSIST 级联实体持久化操作。MERGE 级联实体合并操作。REMOVE 级联实体删除操作。REFRESH 级联实体刷新操作。DETACH 级联实体分离操作。此外,Ca

一大三千的博客 2万+

【简单易懂】JPA概念解析:CascadeType(各种级联操作)详解

https://www.jianshu.com/p/e8caafce5445 【在一切开始之前,我要先告诉大家:慎用级联关系,不要随便给all权限操作。应该根据业务需求选择所需的级联关系。否则可能酿成大祸。切记】 CascadeType.PERSIST 官方文档的说明:Cascade persist operation 看到网上很多博客对这一枚举值的解释是:级联持久化(保存)操作(持久保存拥...

weixin_33744854的博客 1780

spring data jpa cascade级联操作研究

由于平时用mybatis比较多,刚接触spring data jpa的时候,对一对多,多对多关联映射以及关联之间的级联操作学的很迷糊,于是自己实验总结了一下spring data jpa中的6种级联操作。 spring data jpa的级联操作有如下6种CascadeType.ALL,CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.REMOVE。 其中ALL代表包含所有

gitcat的博客 4825

彻底搞懂JPA级联删除机制:从@ManyToOne到@OneToMany的4种删除行为分析

掌握JPA级联删除难题,深入解析@OneToMany与@ManyToOne中cascade的4种删除行为。涵盖实体关联场景、CascadeType配置策略及事务管理要点,避免数据残留与异常。原理清晰、案例实用,值得收藏。

FastSolve的博客 762

JPA中双向@OneToMany级联删除的正确写法(附真实生产环境案例)

掌握JPA中双向@OneToMany级联删除的正确写法,解决实体关联删除失败问题。通过合理配置cascade和orphanRemoval,确保数据一致性,适用于订单与明细等典型场景,避免常见坑点,值得收藏。

PoliSeed的博客 932

Spring Jpa ManyToMany(多对多)关系中的cascade={CascadeType.X} 的配置与总结

角色表 用户表 中间表 CascadeType.MERGE 新增账户并添加不存在的角色,Jpa执行的语句 可以看到首先对role角色表进行了查询,不存在就添加一个角色。 Hibernate: select role0_.role_id as role_id1_4_0_, role0_.role_name as role_nam2_4_0_ from role role0_ where rol...

梅花14的博客 3634

揭秘JPA级联删除失效之谜:@OneToMany CascadeType.ALL为何不生效?

解决JPA @OneToMany 级联删除 cascade失效难题,深入剖析 CascadeType.ALL 不生效的常见原因与正确配置方式,涵盖双向映射、级联策略和数据库约束等关键点,助你精准实现数据联动删除,值得收藏。

FuncIsle的博客 296
上一篇: ActionContext(Action上下文)
下一篇: jqury 如何获取 kindeditor 中textarea 的值
Java18
博客等级 码龄16年 27粉丝 18原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值