mybatis 自动填充无效_解决MybatisPlus自动填充字段Column 'update_time' cannot be null

问题描述

使用MybatisPlus的字段自动填充功能(FieldFill)时,报错"Column 'update_time' cannot be null"

现有配置

实体类

@Data

@Accessors(chain = true)

@TableName("user_info")

public class UserInfo {

@TableField("balance")

private Integer balance;

@TableId(value = "id", type = IdType.ID_WORKER_STR)

private String id;

@TableField("is_deleted")

@TableLogic

private Boolean deleted;

@TableField(value = "create_time", fill = FieldFill.INSERT)

private LocalDateTime createTime;

@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)

private LocalDateTime updateTime;

}

填充配置

@Bean

public MetaObjectHandler metaObjectHandler() {

return new MetaObjectHandler() {

@Override

public void insertFill(MetaObject metaObject) {

this.setFieldValByName("create_time", LocalDateTime.now(), metaObject);

this.setFieldValByName("update_time", LocalDateTime.now(), metaObject);

}

@Override

public void updateFill(MetaObject metaObject) {

this.setFieldValByName("update_time", LocalDateTime.now(), metaObject);

}

};

}

问题排查

断点打到setFieldValByName()方法中,进入Debug

ad2d16814dff

可以看到fieldName为“update_time”,fieldVal为当前时间

继续往下执行到etMeta.hasSetter(fieldName)

ad2d16814dff

查看etMeta.的setters

ad2d16814dff

总结

可以看到问题的根源所在,是因为传入的是下划线命名的update_time,而直接使用它来匹配setter的属性,并没有转换格式

这里不得不说一下MybatisPlus的配置格式统一做的并不好,因为在MybatisPlus代码生成器中配置的fieldName是用下划线命名(数据库字段)的,而在自动填充中fieldName则用驼峰命名(实体属性)

不过如果细看的话确实是有注释的,但仍然不够明确

代码生成器中:

ad2d16814dff

image.png

自动填充中:

ad2d16814dff

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值