当前位置: 首页 > news >正文

SpringDataJPA使用deleteAllInBatch方法逻辑删除失效

概述

在使用Spring Boot JPA时,执行批量删除操作时,遇到逻辑删除失效的问题。具体而言,当使用deleteAllInBatch方法时,数据会被物理删除,而不是进行逻辑删除;但是当使用deleteAll时,逻辑删除操作可以正常生效。经过调查,发现deleteAllInBatch方法和deleteAll方法的行为有所不同,导致逻辑删除失败。

症状

  • 使用deleteAllInBatch方法时,数据直接从数据库中物理删除。
  • 使用deleteAll方法时,逻辑删除生效,数据并未被物理删除,而是更新了delLogic字段。

使用的实体类代码

@Entity
public class TemplateField {@Idprivate Long id;private Integer delLogic;  // 用于标记是否被逻辑删除@PreRemovepublic void templateField() {this.setDelLogic(1);  // 设置逻辑删除标记}@SQLDelete(sql = "UPDATE t_template_field SET del_logic = 1 WHERE id = ?")@Where(clause = "del_logic = 0")  // 过滤删除标记为0的数据public void setDelLogic(Integer delLogic) {this.delLogic = delLogic;}
}

问题原因

问题的根本原因是deleteAllInBatchdeleteAll在执行删除操作时的实现方式不同,导致生命周期回调方法(如@PreRemove)未被触发。

deleteAllInBatchdeleteAll的区别

  1. deleteAll():该方法会逐个加载实体,并在JPA上下文中处理每个实体的删除操作。每次删除实体时,都会触发实体的生命周期回调方法(如@PreRemove@PostRemove等)。因此,当使用deleteAll()方法时,你在实体类上定义的逻辑删除(例如通过@PreRemove标记设置删除标记)可以生效。

  2. deleteAllInBatch():该方法是一个批量删除操作,通常是直接生成SQL语句一次性删除数据,不会逐个加载实体,因此也不会触发实体的生命周期回调方法。批量操作的优势在于效率较高,但缺点是无法触发与实体相关的生命周期事件,如@PreRemove@PostRemove

deleteAllInBatch导致物理删除的原因

deleteAllInBatch()方法并不会按@PreRemove中的逻辑设置delLogic字段,而是直接执行数据库的物理删除操作。这就是为什么在使用deleteAllInBatch()时,数据会被直接从数据库中删除,而不是进行逻辑删除的原因。


问题解决方案

要解决这个问题,通常有以下几种方式:

方案 1:使用deleteAll()替代deleteAllInBatch()

如果逻辑删除的需求比性能更为重要,并且不介意性能稍微下降,可以直接使用deleteAll()方法。这会逐个处理实体,并触发相应的生命周期回调方法,从而确保逻辑删除(即更新delLogic字段)生效。

方案 2:自定义批量更新方法

如果依然希望使用批量删除操作(如deleteAllInBatch()),可以自定义一个批量更新的方法,通过直接执行SQL更新操作来实现逻辑删除。这种方式可以保证批量操作时的效率,同时避免物理删除数据。

例如,使用@Modifying@Query注解,执行批量更新操作:

@Modifying
@Query("UPDATE TemplateField tf SET tf.delLogic = 1 WHERE tf.id IN :ids")
int batchLogicalDelete(@Param("ids") List<Long> ids);

该方法会直接更新符合条件的记录,将delLogic字段设置为1,达到逻辑删除的效果。

方案 3:手动更新实体后再执行批量删除

可以先通过查询获取所有需要“删除”的实体,将它们的delLogic字段设置为逻辑删除标志,然后再调用deleteAllInBatch()进行删除操作。

代码示例:

List<TemplateField> fields = templateFieldRepository.findAllById(ids);
fields.forEach(field -> field.setDelLogic(1));  // 更新逻辑删除标志
templateFieldRepository.saveAll(fields);  // 保存更新
templateFieldRepository.deleteAllInBatch(fields);  // 执行批量删除

这种方式在批量删除前,先手动更新实体,确保逻辑删除字段被正确设置。


问题示例代码

使用deleteAll()进行逻辑删除

List<TemplateField> fields = templateFieldRepository.findAllById(ids);
fields.forEach(field -> field.setDelLogic(1));  // 更新逻辑删除标志
templateFieldRepository.saveAll(fields);  // 保存更新
templateFieldRepository.deleteAll(fields);  // 执行逐个删除(触发生命周期方法)

自定义批量更新方法进行逻辑删除

@Modifying
@Query("UPDATE TemplateField tf SET tf.delLogic = 1 WHERE tf.id IN :ids")
int batchLogicalDelete(@Param("ids") List<Long> ids);// 调用自定义批量逻辑删除方法
templateFieldRepository.batchLogicalDelete(ids);

手动更新实体后再执行批量删除

List<TemplateField> fields = templateFieldRepository.findAllById(ids);
fields.forEach(field -> field.setDelLogic(1));  // 更新逻辑删除标志
templateFieldRepository.saveAll(fields);  // 保存更新
templateFieldRepository.deleteAllInBatch(fields);  // 执行批量删除

总结

  • deleteAllInBatch()方法直接执行SQL批量删除,不会触发实体的生命周期回调方法(如@PreRemove),导致逻辑删除无效。
  • 如果需要触发回调方法,可以使用deleteAll(),但会影响性能。
  • 也可以自定义批量逻辑删除方法,通过直接更新delLogic字段来避免物理删除。

相关文章:

SpringDataJPA使用deleteAllInBatch方法逻辑删除失效

概述 在使用Spring Boot JPA时&#xff0c;执行批量删除操作时&#xff0c;遇到逻辑删除失效的问题。具体而言&#xff0c;当使用deleteAllInBatch方法时&#xff0c;数据会被物理删除&#xff0c;而不是进行逻辑删除&#xff1b;但是当使用deleteAll时&#xff0c;逻辑删除操…...

DOM Node

DOM Node 引言 在Web开发中,DOM(Document Object Model)节点是构建网页和交互式应用程序的核心。DOM节点是文档的构建块,可以用来表示HTML和XML文档中的任何部分。本文将详细介绍DOM节点的基本概念、类型、操作方法以及在实际开发中的应用。 什么是DOM节点? DOM节点是…...

基于STM32的智能家居能源管理系统

1. 引言 传统家庭能源管理存在能耗监控粗放、设备联动不足等问题&#xff0c;难以适应绿色低碳发展需求。本文设计了一款基于STM32的智能家居能源管理系统&#xff0c;通过多源能耗监测、负荷预测与优化调度技术&#xff0c;实现家庭能源的精细化管理与智能优化&#xff0c;提…...

智慧园区后勤单位消防安全管理:安全运营和安全巡检

//智慧园区消防管理困境大曝光 智慧园区&#xff0c;听起来高大上&#xff0c;但消防管理却让人头疼不已。各消防子系统各自为政&#xff0c;像一座座孤岛&#xff0c;信息不共享、不协同。 消防设施管理分散&#xff0c;不同区域、企业的设备标准不一样&#xff0c;维护情况…...

HTML 日常开发常用标签

文章目录 HTML 日常开发常用标签1、基本结构标签2、内容标签3、多媒体标签4、表单标签5、列表和定义标签6、表格标签7、链接和图像8、元数据9、语义化标签&#xff08;HTML5新增&#xff09;10、框架和内联11、交互12、过时或不推荐使用的标签 HTML 日常开发常用标签 1、基本结…...

Spring事务失效六大场景

引言 Spring事务一般我们采用注解实现&#xff0c;但是我们构造事务实现的时候常常没察觉失效的情况&#xff0c;本篇文章总结事务失效的六大情况&#xff0c;帮助我们深刻理解事务失效的边界概念 1. 方法自调用 这个主要是针对声明式事务的&#xff0c;经过前面的介绍&…...

【缓冲区】数据库备份的衍生问题,缓冲区在哪里?JVMor操作系统?(二)

【缓冲区】数据库备份的衍生问题&#xff0c;缓冲区在哪里&#xff1f;JVMor操作系统&#xff1f;&#xff08;二 完结&#xff09; 缓冲区既属于操作系统&#xff0c;也属于 JVM&#xff0c;具体取决于你讨论的是哪个层面的缓冲区。下面我会详细解释这两者的区别和联系。 1. …...

如何免费使用稳定的deepseek

0、背景&#xff1a; 在AI辅助工作中&#xff0c;除了使用cursor做编程外&#xff0c;使用deepseek R1进行问题分析、数据分析、代码分析效果非常好。现在我经常会去拿行业信息、遇到的问题等去咨询R1&#xff0c;也给了自己不少启示。但是由于官网稳定性很差&#xff0c;很多…...

钉钉小程序(企业内部应用)开发--钉钉小程序web-view嵌套H5与小程序之间的通信(H5跳转钉钉小程序小程序postMessage)

钉钉小程序代码&#xff1a;嵌套H5 pages/login/index.axml <web-view src"{{urlH5}}" onMessage"test"></web-view> H5向小程序发送信息&#xff1a; H5代码&#xff1a; 通过以下代码我一直报错dd没有被定义 if (navigator.userAgent.to…...

超级免费/牛的图片格式转换工具jpg/jpeg/png

选择多次图片文件&#xff0c;并在所有图片选择完后进行批量转换。这种需求可以通过tkinter来实现&#xff0c;它是Python的标准GUI库&#xff0c;能够提供一个简洁的界面来选择文件和执行操作。您的代码要是网络运行不流畅可以试试它​​​​​​​ 下面是一个简单的GUI程序&a…...

毛泽东思想“活的灵魂”

关于毛泽东思想“活的灵魂”的构成及其内涵&#xff0c;综合历史文献与权威表述&#xff0c;核心内容整理如下&#xff1a; 一、毛泽东思想活的灵魂的权威定义 根据十一届六中全会《关于建国以来党的若干历史问题的决议》&#xff08;1981年&#xff09;&#xff0c;毛泽东思想…...

RabbitMQ系列(三)基本概念之Consumer

在 RabbitMQ 中&#xff0c;Consumer&#xff08;消费者&#xff09; 是负责从队列&#xff08;Queue&#xff09;中获取并处理消息的客户端角色&#xff0c;其核心机制与功能如下&#xff1a; 一、Consumer 的定义与核心作用 消息处理终端 Consumer 通过订阅或拉取队列中的消…...

天梯L2-003 月饼

L2-003 月饼 - 团体程序设计天梯赛-练习集 def slove():n,m map(float,input().split())z list(map(float,input().split()))y list(map(float,input().split()))n int(n)d []for i in range(n):d.append([z[i],y[i]])d.sort(key lambda x:x[1]/x[0],reverse True)cnt…...

使用DeepSeek/ChatGPT等AI工具辅助编写wireshark过滤器

随着deepseek,chatgpt等大模型的能力越来越强大&#xff0c;本文将介绍借助deepseek&#xff0c;chatgpt等大模型工具&#xff0c;通过编写提示词&#xff0c;辅助生成全面的Wireshark显示过滤器的能力。 每一种协议的字段众多&#xff0c;流量分析的需求多种多样&#xff0c;…...

常用的AI文本大语言模型汇总

AI文本【大语言模型】 1、文心一言https://yiyan.baidu.com/ 2、海螺问问https://hailuoai.com/ 3、通义千问https://tongyi.aliyun.com/qianwen/ 4、KimiChat https://kimi.moonshot.cn/ 5、ChatGPThttps://chatgpt.com/ 6、魔塔GPT https://www.modelscope.cn/studios/iic…...

《深度剖析:特征工程—机器学习的隐秘基石》

在机器学习的宏大版图中&#xff0c;特征工程宛如一座隐藏在幕后却又至关重要的基石。它默默发挥着作用&#xff0c;将原始数据雕琢成模型能够有效学习和理解的形态&#xff0c;深刻影响着机器学习模型的性能与表现。 特征工程&#xff1a;机器学习的关键前奏 特征工程是运用…...

解决npm run dev报错

解决&#xff1a;Node.js 版本更新后与 OpenSSL 不兼容导致的npm报错“Error: error:0308010C:digital envelope routines::unsupported” 方法一&#xff1a;更改系统环境变量方法二&#xff1a;更改项目环境变量方法三&#xff1a;更换 Node.js 版本方法四&#xff1a;升级依…...

教你通过腾讯云AI代码助手,免费使用满血版deepseek r1,还可以自定义知识库!

大家好&#xff0c;今天教大家如何通过腾讯云AI代码助手,免费使用全世界最牛逼的deepseek大模型的deepseek r1满血版&#xff01; 1. 环境准备 提前下载好下面任意的一款编程使用的代码编辑器 Visual Studio CodeJetBrains IDEsVisual Studio微信开发者工具 2. 下载安装 打…...

【C++/数据结构】栈的模拟实现

零.导言 栈是一种数据结构&#xff0c;在后续的学习中可能经常使用&#xff0c;因此我们今天就来学习如何实现栈&#xff0c;以更好地使用它。 一.栈的模拟实现 栈的形式如下&#xff1a; #include<iostream> #include<cassert>using namespace std;typedef int S…...

StarRocks 开发环境搭建踩坑指北之存算分离篇

前段时间碰到一个 StarRocks 物化视图的 bug: https://github.com/StarRocks/starrocks/issues/55301 但是这个问题只能在存算分离的场景下才能复现&#xff0c;为了找到问题原因我便尝试在本地搭建一个可以 Debug 的存算分离版本。 之前也分享过在本地 Debug StarRocks&#x…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...