首页 > 其他分享 >@TableLogic导致update失效

@TableLogic导致update失效

时间:2024-07-26 15:29:12浏览次数:13  
标签:逻辑 删除 update believer TableLogic 注解 失效 delete

前言

1.为什么要使用TableLogic?

(1) 在某些业务需求场景下,删除数据需要采用逻辑删除而不是物理删除

(2) 方便以后数据审计、历史数据的分析、保证多表数据的完整性

然而,这一功能在某些情况下会导致更新操作失效。本文将详细讨论 @TableLogic 如何影响更新操作,并提供相应的解决方案。

开始

@TableLogic 是 MyBatis-Plus 提供的一种注解,用于标记逻辑删除字段。逻辑删除即在数据库中保留数据,只是通过修改特定字段(如 is_delete)的值来标记记录为已删除状态。

.....如何发现这个问题的?

....一天,产品经理突然宣布要将物理删除改成逻辑删除。我对屎山进行了大刀阔斧的改造,自信满满地认为一切都很顺利。

再一段时间后,在天气晴朗的日子中,我发现删除掉一条用户数据后,再进行添加该数据,发现不管添加几次,数据库中就是看不到新的记录。

“这一定是个小问题,”我心想。于是,我信心满满地开始排查 BUG,认为这不过是分分钟的事情。然而,时间一秒一秒地过去……

10分钟,没找到问题;

30分钟,依然没头绪;

1小时,依旧毫无进展。

................

................


直到我注意到了我实体类上的 is_delete 字段上多了个 @TableLogic 注解。

不对劲,很有可能问题出现在这里,我去查阅了各种资料。

果然,问题就是出现在这里。

原来是我同事将 is_delete 这个字段加入了 @TableLogic 注解,导致了更新操作不生效,所以在进行新增数据时始终无法添加。

问题解决了!

@TableName("syg.syg_believer")
@Data
public class Believer implements Serializable {
 
    private Long userId;

    private String  openId;
    
    private String level;
    
    .........

//    @TableLogic(delval = "1")
    private Integer isDelete;

}

在这个示例中,isDelete 字段被标记为逻辑删除字段。@TableLogic 注解告诉 MyBatis-Plus 在执行删除操作时,将该字段的值设置为 1 而不是物理删除记录。


由于is_delete 这个字段加入了 @TableLogic 注解,所以我在更新用户数据的时候,这个注解导致了updateById这个方法失效了,所以怎么添加数据都不会成功。


//信众存在并且处于删除状态
if (Objects.nonNull(believer) && believer.getIsDelete()==BELIEVER_DELETED){
    believer.setIsDelete(BELIEVER_NOT_DELETED);
    BeanUtils.copyProperties(addBelieverPO, believer);
    believer.setMerit(addBelieverPO.getMerit());
    believer.setRegTime(new Date());
    believer.setOpenId(String.valueOf(DEFAULT_OPENID));
    believer.setAge(age.getYears());
    believer.setUserId(sysUser.getUserId());
    //判断信众等级
    LevelEnums level = LevelEnums.getLevel(believer.getGrowth(), believer.getMerit());
    believer.setLevel(String.valueOf(level));

    if (!updateById(believer)){
        return AjaxResult.error(BELIEVER_ADD_ERROR);
    }
}

@TableLogic 是 MyBatis-Plus 提供的一种注解,用于标记逻辑删除字段。逻辑删除即在数据库中保留数据,只是通过修改特定字段(如 is_delete)的值来标记记录为已删除状态。

更新操作为何失效

使用 @TableLogic 注解后,当我们尝试更新记录时,MyBatis-Plus 会自动将逻辑删除字段加入 where 子句,以确保只操作未被逻辑删除的记录。如果记录已经被逻辑删除(如 is_delete = 1),那么更新操作将不会匹配到任何记录,从而导致更新不生效。如在这个示例中执行UpdateById的操作,对其他字段的设置忽略,只关心is_delete这个字段

UPDATE syg_believer 
SET age = #{age} (其它字段忽略....) WHERE id = #{userId} AND is_delete = 0;

UPDATE syg_believer SET age = #{age} (其它字段忽略....) WHERE id = #{userId} AND is_delete = 0;

如果 user_id 的记录 is_delete 为 1,则此更新操作不会生效。

解决方案

方案 1:通过 UpdateWrapper 手动指定更新逻辑删除字段
UpdateWrapper<Believer> updateWrapper = new UpdateWrapper<>(); 
updateWrapper
        .set("is_delete", 1)
        .eq("user_id", userId); 

userMapper.update(null, updateWrapper);
方案 2:自定义 SQL 更新
<update id="believerUpdateByUserId">
        UPDATE syg_believer SET is_delete = #{isDelete} WHERE user_id = #{userId} 
</update>

结语

通过理解和使用 MyBatis-Plus 提供的 @TableLogic 注解,我们可以有效地实现逻辑删除,同时避免由于逻辑删除字段导致的更新操作失效问题。

为了避免类似的问题再次发生,建议大家在遇到更新操作不生效的情况时,除了排查常规原因外,也要注意检查是否有类似 @TableLogic 的注解影响了操作逻辑。这个小知识点可以帮助大家扩大排查范围,减少排查时间,提高工作效率。

标签:逻辑,删除,update,believer,TableLogic,注解,失效,delete
From: https://blog.csdn.net/weixin_69329906/article/details/140689415

相关文章

  • Redis缓存面试问题解析:如何有效管理缓存失效策略?
    在技术面试中,Redis缓存是一个常见的话题。面试官往往会考察候选人对缓存机制的理解以及在实际场景中的应用能力。本文将探讨一个在Redis缓存面试中经常被问到的问题,并深入解析其背后的概念和解决方案。面试问题:如何管理Redis缓存的失效策略?问题描述:在高并发的web应用中,缓存是提......
  • React——useEffect和自定义useUpdateEffect
    useEffect是React的一个内置Hook,用于在组件渲染后执行副作用(例如数据获取、订阅或手动更改DOM)。它将在第一次渲染后和每次更新后都会执行。useEffect(()=>{//这里的代码将在组件挂载和更新时执行。},[dependencies]);//dependencies数组控制effect的重新执行。......
  • Django get_or_create和update_or_create 的作用和使用
    Djangoget_or_create和update_or_create的作用和使用:get_or_create和update_or_create是Django中的两个有用的方法,用于在数据库中获取或创建记录。如果记录不存在,则创建它们;如果存在,则返回现有记录。这两个方法帮助简化了避免重复记录的逻辑,并提供了一种简洁的方法来更新......
  • 为啥Spring原理中依赖注入之后,再做AOP代理依赖注入将失效
    在java中,依赖注入(DependencyInjection,简称DI)是一种设计模式,它通过将对象的依赖关系从代码中移除,而是通过外部容器来管理和注入依赖。这样可以提高代码的可维护性和可测试性。AOP(Aspect-OrientedProgramming,面向切面编程)是另一种编程范式,它允许开发者在不修改原有代码的情......
  • 类中方法内部调用导致的事务失效解决方法
    方法1:自己注自己方法2:AspectJ:先添加依赖<!--aspecj--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId></dependency> 在启动类上添加注解  //获取当前的代理对象IUserCouponServiceproxy=((IuserCou......
  • Ubuntu中如何使用Update-rc.d命令(转)
    在Ubuntu中,update-rc.d命令用于管理系统的服务(init脚本)的启动和停止顺序。它允许你将服务添加到特定的运行级别,并设置服务在系统启动时是否自动启动。以下是一些常用的update-rc.d命令示例及其说明:添加服务到特定运行级别:sudo update-rc.d  defaults将指定的服务添加到默认......
  • Warning formula.jws.json update failed, falling back to cached version
    Warning:formula.jws.json:updatefailed,fallingbacktocachedversion.MacOS执行服务启动命令时,显示下载失败警告,导致无法启动服务MacBook-Pro~%brewservicesstartnginx==>Downloadinghttps://formulae.brew.sh/api/formula.jws.json########......
  • mybatisPlus3.4 自定义sqlSessionFactory sql注入器失效、mybatis-plus批量插入报错In
    文章目录一、报错背景二、解决方法在mybatis-plus项目中集成自定义批量插入方法后报错。以下整理一下报错及解决方法。一、报错背景mybatis-plus是不提供insertList批量插入方法的,本人在自定义批量插入方法后,启动时正常,但是执行到insertList时报错。org.apache.i......
  • 记一次Vue.nextTick失效的解决经历
    问题背景在一个老页面上渲染echarts,在vue的mounted里面使用this.$nextTick,无法获取到ref。也就是获取不到dom。解决思路一开始怀疑vue的版本不对,但是后来vue升级到vue2.6.14,还是不行。控制台也没有任何报错,页面能正常渲染。这个时候我开始想,是不是使用的vuejs文件是生产版......
  • Nessus Professional 10.7.5 Auto Installer for macOS Sonoma (updated Jul 2024)
    NessusProfessional10.7.5AutoInstallerformacOSSonoma(updatedJul2024)发布Nessus试用版自动化安装程序,支持macOSSonoma、RHEL9和Ubuntu24.04请访问原文链接:https://sysin.org/blog/nessus-auto-install-for-macos/,查看最新版。原创作品,转载请保留出处。作......