Mybatis-Plus自动填充失效问题:当字段不为空时无法插入

本文介绍了MyBatis-Plus在自动填充更新时遇到的问题,即第二次更新时不进行自动填充。原因是MetaObjectHandler的默认策略是属性已有值时不覆盖。解决方案是使用`this.setFieldValByName`方法来强制更新字段,无论其是否有值。通过修改自动填充策略,确保每次更新都能正确填充更新时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文针对mybatis-plus自动填充第一次更新能正常填充,第二次更新无法自动填充问题。
👇mybatis-plus自动填充:当要填充的字段不为空时,填充无效问题的解决👇
先上一副官方的图:

在这里插入图片描述
取自官方:https://mp.baomidou.com/guide/auto-fill-metainfo.html

第三条注意事项为自动填充失效原因:

MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充

以官方案例为例:


```java
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
        // 或者
        this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
        // 或者
        this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
        // 或者
        this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
        // 或者
        this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
    }
}
  • 第一次执行更新时,由于updateTime属性值为空,填充值为 LocalDateTime.now(),数据库能够正常填充,填充值为当前时间。
  • 第二次执行更新时,正如官方注意事项的第三条

MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充

第二次更新时,由于此时数据库中的updateTime字段已经有值了,自动填充将不进行覆盖,因此不会进行自动填充。

解决办法:
将官方的自动填充策略换为如下语句

@Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ...");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

不论数据库中updateTime字段是否有值,都将该值更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值