mybatisplus 更新时间自动填充失效

一,问题

使用mybatisplus创建,修改时间自动填充功能时,发现新增创建时间,修改时间更新了,修改数据时,更新时间未更新

代码如下

   /**
     * 创建时间
     */
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT)
    private Date creationDate;

    private String lastUpdatedBy;

    /**
     * 修改时间
     */
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date lastUpdateDate;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 新增填充
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.fillStrategy(metaObject, "creationDate", new Date());
        updateFill(metaObject);
    }

    /**
     * 更新填充
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.fillStrategy(metaObject, "lastUpdateDate", new Date());
//        this.strictUpdateFill(metaObject, "lastUpdateDate", LocalDateTime.class, LocalDateTime.now());
    }
}

二,原因

    @Override
    public void updateFill(MetaObject metaObject) {
        this.fillStrategy(metaObject, "lastUpdateDate", new Date());
        this.strictUpdateFill(metaObject, "lastUpdateDate", LocalDateTime.class, LocalDateTime.now());
    }

跟踪1

先看下自动更新的逻辑中两个方法,

方式1,fillStrategy 失败
本质原因:当该字段有值之后,自动填充不进行填充,里面的数据还是原值
方式2,strictUpdateFill 成功
不管是否有原值都强制执行更新

所以选择方式二

参考

Mybatis-plus自动填充不生效或自动填充数据为null原因及解决方案_java_脚本之家

跟踪2

经测试还是不行

原因如下

再次改动,如下 

    @Override
    public void updateFill(MetaObject metaObject) {
//        this.strictUpdateFill(metaObject, "lastUpdateDate", Date.class, new Date());
        setFieldValByName("lastUpdateDate", new Date(), metaObject);
    }

1.把 LocalDateTime.class, LocalDateTime.now() 改成Date

2.参考如下文档

mybatisplus自动填充更新时间失效 - 知乎

方法换成 setFieldValByName,结果还是不行

跟踪3

重写方法,参考如下

成长足迹-MyBatis-Plus更新update自动填充功能无效解决办法

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis Plus 可以与逻辑删除和自动填充功能结合使用,以实现在逻辑删除操作时自动填充相应字段的值。 要使用逻辑删除和自动填充功能,需要进行以下几个步骤: 1. 在数据库表中添加一个用于标识逻辑删除的字段,例如 `deleted`,通常为一个整型字段。 2. 在对应的实体类中添加一个用于映射逻辑删除字段的属性,并使用 `@TableLogic` 注解进行标识。 3. 创建一个实现了 `MetaObjectHandler` 接口的类,例如 `MyMetaObjectHandler`。 4. 在 `MyMetaObjectHandler` 类中,重写 `insertFill` 和 `updateFill` 方法,用于自动填充逻辑删除字段的值。 5. 在 MyBatis Plus 的配置文件中,添加配置项 `metaObjectHandler`,指定使用的自定义 `MetaObjectHandler` 实现类。 以下是一个示例: ```java public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class); this.strictInsertFill(metaObject, "deleted", false, Boolean.class); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class); } } @TableLogic private Boolean deleted; ``` 在上述示例中,`MyMetaObjectHandler` 类中的 `insertFill` 方法会在插入操作时自动填充 `createTime` 和 `deleted` 字段的值,而 `updateFill` 方法会在更新

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值