mybatis-plus
mybatis-plus copied to clipboard
字段自动填写不起作用
当前使用版本(必填,否则不予处理)
3.5.1
该问题是如何引起的?(确定最新版也有问题再提!!!)
新版本中的字段自动填写不起作用,使用旧版本的就可以 猜测:可能和字段的类型有关系.时间类型中的几种类型可能导致不起作用
重现步骤(如果有就写完整)
//插入时的填充策略 @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill ...."); //LocalDateTime now = LocalDateTime.now();//线程安全 //new Date() //线程不安全 this.strictInsertFill(metaObject, "dateCreated", LocalDateTime.class, LocalDateTime.now()); //偶尔起作用 this.strictInsertFill(metaObject, "lastUpdated", LocalDateTime.class, LocalDateTime.now()); //偶尔起作用 // this.setFieldValByName("dateCreated",LocalDateTime.now(),metaObject); // this.setFieldValByName("lastUpdated",LocalDateTime.now(),metaObject); this.strictInsertFill(metaObject, "isDeleted", Boolean.class, false); }
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.setFieldValByName("lastUpdated",LocalDateTime.now(),metaObject); //这个起作用
// this.strictUpdateFill(metaObject, "lastUpdated", LocalDateTime.class, LocalDateTime.now()); //这个不起作用 // this.strictUpdateFill(metaObject, "lastUpdated", () -> LocalDateTime.now(), LocalDateTime.class); //这个不起作用
报错信息
没有报错信息,数据填充为null
检查是否按照文档: https://baomidou.com/pages/4c6bcf/ 是否在对应字段添加
public class User {
// 注意!这里需要标记为填充字段
@TableField(.. fill = FieldFill.INSERT)
private String fillField;
....
}
也是3.5.1版本,出现了同样的问题。在实体类已经按照文档写了,依然为NULL。
@TableField(value = "created_at", fill = FieldFill.INSERT)
@VampireAchao 3.4.3版本没问题。
执行官方的用例,mybatis-plus-sample-auto-fill-metainfo,确认是最新版本3.5.2
before user:User(id=1, name=Jone, age=18, [email protected], operator=test)
start update fill ....
==> Preparing: UPDATE user SET NAME=?, AGE=?, EMAIL=?, OPERATOR=? WHERE ID=?
==> Parameters: Jone(String), 12(Integer), [email protected](String), test(String), 1(Long)
<== Updates: 1
==> Preparing: SELECT ID,NAME,AGE,EMAIL,OPERATOR FROM user WHERE ID=?
==> Parameters: 1(Long)
<== Total: 1
query user:User(id=1, name=Jone, age=12, [email protected], operator=test)
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "operator", String.class, "Tom");
}
按照,MyMetaObjectHandler的updateFill自动填充说明,这里的operator应该填充为 Tom,但是打印还是test
有值默认不覆盖,给出你的复现demo以git形式
。。。明白了。。。 MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充
确实有这么一句话,,,但是没有明确标注,所以没看到。。。是我没好好看黄颜色的提示。