問(wèn)題描述
使用MybatisPlus的字段自動(dòng)填充功能(FieldFill)時(shí),報(bào)錯(cuò)"Column 'update_time' cannot be null"
現(xiàn)有配置
實(shí)體類
@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);
}
};
}
問(wèn)題排查
- 斷點(diǎn)打到setFieldValByName()方法中,進(jìn)入Debug

可以看到fieldName為“update_time”,fieldVal為當(dāng)前時(shí)間
- 繼續(xù)往下執(zhí)行到etMeta.hasSetter(fieldName)

- 查看etMeta.的setters

總結(jié)
可以看到問(wèn)題的根源所在,是因?yàn)閭魅氲氖窍聞澗€命名的update_time,而直接使用它來(lái)匹配setter的屬性,并沒(méi)有轉(zhuǎn)換格式
這里不得不說(shuō)一下MybatisPlus的配置格式統(tǒng)一做的并不好,因?yàn)樵贛ybatisPlus代碼生成器中配置的fieldName是用下劃線命名(數(shù)據(jù)庫(kù)字段)的,而在自動(dòng)填充中fieldName則用駝峰命名(實(shí)體屬性)
不過(guò)如果細(xì)看的話確實(shí)是有注釋的,但仍然不夠明確
代碼生成器中:

image.png
自動(dòng)填充中:

image.png