当前使用版本(必填,否则不予处理)

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

Comment From: VampireAchao

检查是否按照文档: https://baomidou.com/pages/4c6bcf/ 是否在对应字段添加

public class User {

    // 注意!这里需要标记为填充字段
    @TableField(.. fill = FieldFill.INSERT)
    private String fillField;

    ....
}

Comment From: gswy

也是3.5.1版本,出现了同样的问题。在实体类已经按照文档写了,依然为NULL。

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

@VampireAchao 3.4.3版本没问题。

Comment From: WarriorFromLongAgo

执行官方的用例,mybatis-plus-sample-auto-fill-metainfo,确认是最新版本3.5.2

before user:User(id=1, name=Jone, age=18, email=test1@baomidou.com, operator=test)
start update fill ....
==>  Preparing: UPDATE user SET NAME=?, AGE=?, EMAIL=?, OPERATOR=? WHERE ID=?
==> Parameters: Jone(String), 12(Integer), test1@baomidou.com(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=test1@baomidou.com, 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

Comment From: miemieYaho

有值默认不覆盖,给出你的复现demo以git形式

Comment From: WarriorFromLongAgo

。。。明白了。。。 MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充

确实有这么一句话,,,但是没有明确标注,所以没看到。。。是我没好好看黄颜色的提示。