JPA @SoftDelete 实现逻辑删除

版本

  • jpa maven
 

xml

代码解读

复制代码

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>3.3.1</version> </dependency>

  • springboot 版本:3.3.1

简单使用

只需在实体类上@SoftDelete 即可实现逻辑删除
例如:

 

java

代码解读

复制代码

@SoftDelete public class Student { // 省略。。。。 }

默认配置使用 DELETED策略,并作为布尔值存储在 deleted字段中。

@SoftDelete 的定义

 

java

代码解读

复制代码

@Target({ElementType.PACKAGE, ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Incubating public @interface SoftDelete { String columnName() default ""; SoftDeleteType strategy() default SoftDeleteType.DELETED; Class<? extends AttributeConverter<Boolean, ?>> converter() default UnspecifiedConversion.class; public interface UnspecifiedConversion extends AttributeConverter<Boolean, Object> { } }

columnName 为逻辑删除字段列名,converter 的一个数据库存在字段值到表示删除的转换器,比如如果我们想让1表示已删除0表示未删除可以用内置的NumericBooleanConverter 转换器。

进阶

自定义converter

只是使用0和1表示删除状态无法满足唯一索引的应用场景,我们可以使用删除时间表示删除状态,这时我们就需要自定义converter,示例:

 

java

代码解读

复制代码

package com.breeze.jpa.extension.converter; import jakarta.persistence.AttributeConverter; /** * 用于软删除 * @author fan * @date 2024/8/6 */ public class TimestampBooleanConverter implements AttributeConverter<Boolean,Long> { @Override public Long convertToDatabaseColumn(Boolean aBoolean) { return Boolean.TRUE.equals(aBoolean) ? System.currentTimeMillis() : 0L; } @Override public Boolean convertToEntityAttribute(Long aLong) { return aLong != null && aLong > 0L; } }

这样当执行查询操作时jpa会通过调用convertToDatabaseColumn方法获取未删除状态对应的数据库字段存储值,对应是0,添加过滤条件where f1_0.delete_at=0。删除时也调用convertToDatabaseColumn传入true返回当前时间戳 例如:

整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记【点击此处即可】免费获取

sql

代码解读

复制代码

update foo set delete_at=1725809750120 where id=? and delete_at=0 and version=?

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值