mybatis-plus icon indicating copy to clipboard operation
mybatis-plus copied to clipboard

字段自动填写不起作用

Open anyutianluo opened this issue 2 years ago • 2 comments

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

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

anyutianluo avatar Mar 10 '22 04:03 anyutianluo

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

public class User {

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

    ....
}

VampireAchao avatar Apr 20 '22 14:04 VampireAchao

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

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

@VampireAchao 3.4.3版本没问题。

gswy avatar May 23 '22 00:05 gswy

执行官方的用例,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

WarriorFromLongAgo avatar Nov 02 '22 14:11 WarriorFromLongAgo

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

miemieYaho avatar Nov 03 '22 02:11 miemieYaho

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

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

WarriorFromLongAgo avatar Nov 04 '22 01:11 WarriorFromLongAgo