2022年SpringBoot+MyBatis-Plus自动填充时关键字段updateTime想要在insert和update时都更新,但是,insert的时候失效了,为null?如何解决?

友情提示比较着急的同学直接看带颜色的字儿:

红色为问题黄色为原因绿色为解决方法

博主跟随mybatis-plus官网进行学习字段填充时,发现在insert的时候,想要去更新updateTime,一直为null

踩到的坑如下:

一、在进行插入的时候一直报错,找不到column create_time 

User 这个实体类中定义的创建时间与更新时间为:

createTime

updateTime

数据库user表中创建时间与更新时间为:

createTime

updateTime

自定义MyMetaObjectHandler,抄的官网上的:属性也是createTime与updateTime

@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(推荐使用)
//        updateFill( metaObject);
        // 或者
//        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)
    }
}

属性与字段一模一样,按道理来讲没得问题呀!

数据库中的user表我没有写这一列,怎么非要找这个create_time

原因:mybatis-plus应该是自动帮我们将实体中的属性与列名进行驼峰与下划线的转换

解决:后来将数据库user表中创建时间与更新时间改为:

create_time

update_time

就不报错了

二、执行插入语句时: create_time、update_time 为null,没有报错

原因:MyMetaObjectHandler中createTime与updateTime数据类型与User实体中的不一致

User实体中:

 MyMetaObjectHandler中:

 解决:

将User实体中的createTime与updateTime数据类型更换为java1.8的LocalDateTime或者 

将 MyMetaObjectHandler LocalDateTime变更为Date与User实体一致即可(两种博主都试过)

三、执行插入语句时: create_time OK了有值,update_time 为null,没有报错

        单独执行更新语句时,update_time 也OK也有值

 User实体填充注解如下:

 解决:最后各种搜索,也没解决,最后想着不行自己修改一下MyMetaObjectHandler

就是在insertFill 这个方法中执行最后在执行一下updateFill( metaObject);

@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.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
//        updateFill( metaObject);
        // 或者
//        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)
    }
}

总结一下:

              1、 数据库用下划线命名的列,对应实体用小驼峰命名

              2、实体里的需要填充的字段的类型要与 MyMetaObjectHandler需一致

              3、@TableField(fill = FieldFill.INSERT_UPDATE)注解只能帮助我们写sql,不能帮忙去帮updateTime赋值因此MyMetaObjectHandler中insert方法里要写update方法,按照预期:

public enum FieldFill {
    /**
     * 默认不处理
     */
    DEFAULT,
    /**
     * 插入填充字段
     */
    INSERT,
    /**
     * 更新填充字段
     */
    UPDATE,
    /**
     * 插入和更新填充字段
     */
    INSERT_UPDATE
}

 执行instert时:应该调用MyMetaObjectHandler中的insertFill与updateFill,两个方法,而不是单纯的调用一个insertFill,sql都帮我们写了,值却为null。问题虽然解决的,但是还是有些困惑,欢迎各位小伙伴帮忙解惑与指正。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值