問題描述
使用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);
}
};
}
問題排查
- 斷點(diǎn)打到setFieldValByName()方法中,進(jìn)入Debug
可以看到fieldName為“update_time”滓技,fieldVal為當(dāng)前時(shí)間
- 繼續(xù)往下執(zhí)行到etMeta.hasSetter(fieldName)
- 查看etMeta.的setters
總結(jié)
可以看到問題的根源所在抛蚁,是因?yàn)閭魅氲氖窍聞澗€命名的update_time舅踪,而直接使用它來匹配setter的屬性茧痒,并沒有轉(zhuǎn)換格式
這里不得不說一下MybatisPlus的配置格式統(tǒng)一做的并不好,因?yàn)樵贛ybatisPlus代碼生成器中配置的fieldName是用下劃線命名(數(shù)據(jù)庫字段)的锐想,而在自動(dòng)填充中fieldName則用駝峰命名(實(shí)體屬性)
不過如果細(xì)看的話確實(shí)是有注釋的帮寻,但仍然不夠明確
代碼生成器中:
image.png
自動(dòng)填充中:
image.png