Mybatis-Plus自动填充失效问题:当字段不为空时无法插入

本文介绍了MyBatis-Plus在自动填充更新时遇到的问题,即第二次更新时不进行自动填充。原因是MetaObjectHandler的默认策略是属性已有值时不覆盖。解决方案是使用`this.setFieldValByName`方法来强制更新字段,无论其是否有值。通过修改自动填充策略,确保每次更新都能正确填充更新时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文针对mybatis-plus自动填充第一次更新能正常填充,第二次更新无法自动填充问题。
👇mybatis-plus自动填充:当要填充的字段不为空时,填充无效问题的解决👇
先上一副官方的图:

在这里插入图片描述
取自官方:https://mp.baomidou.com/guide/auto-fill-metainfo.html

第三条注意事项为自动填充失效原因:

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

以官方案例为例:


```java
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
        // 或者
        this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
        // 或者
        this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
        // 或者
        this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
        // 或者
        this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
    }
}
  • 第一次执行更新时,由于updateTime属性值为空,填充值为 LocalDateTime.now(),数据库能够正常填充,填充值为当前时间。
  • 第二次执行更新时,正如官方注意事项的第三条

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

第二次更新时,由于此时数据库中的updateTime字段已经有值了,自动填充将不进行覆盖,因此不会进行自动填充。

解决办法:
将官方的自动填充策略换为如下语句

@Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ...");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

不论数据库中updateTime字段是否有值,都将该值更新。

### 回答1: 您好,关于mybatis-plus自动填充失效问题,可能有以下几种原因: 1. 没有正确配置自动填充插件。需要在MybatisPlusConfig类中添加自动填充插件的配置,例如: ```java @Configuration public class MybatisPlusConfig { @Bean public GlobalConfig globalConfig() { GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setMetaObjectHandler(new MyMetaObjectHandler()); return globalConfig; } } ``` 其中MyMetaObjectHandler是自定义的实现了MetaObjectHandler接口的类,用于填充实体类中的字段。 2. 实体类中没有使用注解标记需要自动填充字段。需要在实体类中使用注解标记需要自动填充字段,例如: ```java public class User { @TableId(type = IdType.AUTO) private Long id; private String name; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; // 省略getter和setter方法 } ``` 其中createTime字段使用了@TableField(fill = FieldFill.INSERT)注解,表示在插入数据自动填充字段;updateTime字段使用了@TableField(fill = FieldFill.INSERT_UPDATE)注解,表示在插入更新数据自动填充字段。 3. 数据库中的字段类型与实体类中的字段类型不匹配。需要确保数据库中的字段类型与实体类中的字段类型一致,否则自动填充可能会失效。 希望以上信息能够帮助您解决mybatis-plus自动填充失效问题。 ### 回答2: Mybatis-PlusMybatis 的增强工具包,在 Mybatis 的基础上增加了许多实用的功能,其中自动填充是其非常常用的一个功能。 如果 Mybatis-Plus自动填充失效了,可能是以下原因导致的: 1. Entity 类中的字段名称和表中的列名不一致。 自动填充是依赖于 Entity 类中的字段来完成的,如果 Entity 类中的字段名称与表中的列名不一致,就会导致自动填充无法生效。 解决方法:真实名称与 Entity 类中的字段名称保持一致。 2. 自动填充字段未在表中设置默认值。 自动填充需要在表中设置默认值才能生效,如果没有设置默认值,自动填充就会失效。 解决方法:在表中设置自动填充字段的默认值。 3. 自动填充机不对。 Mybatis-Plus自动填充有三种机:插入填充更新填充插入更新填充。如果设置的机不对,就会使自动填充无法生效。 解决方法:检查自动填充机是否正确。 4. 自动填充类没有实现 MetaObjectHandler 接口。 自动填充是通过 MetaObjectHandler 接口来实现的,如果自动填充类没有实现该接口,就会导致自动填充失效。 解决方法:实现 MetaObjectHandler 接口,并在配置文件中配置自动填充类。 以上是 Mybatis-Plus 自动填充失效的可能原因和解决方法,根据具体情况进行排查和修复即可。 ### 回答3: mybatis-plus自动填充失效可能会有以下几个原因: 1. 没有在实体类中定义自动填充字段和注解 在使用mybatis-plus自动填充功能,需要在实体类中定义自动填充字段,并使用注解@TableField(fill = FieldFill.INSERT_UPDATE)或@TableField(fill = FieldFill.INSERT)或@TableField(fill = FieldFill.UPDATE)注解,指定自动填充的类型。 2. mybatis-plus版本问题 如果使用的mybatis-plus版本过低,可能会导致自动填充失效。建议升级mybatis-plus的版本至最新版或者高于3.0.6版本。 3. 没有配置mybatis-plus自动填充器 在使用mybatis-plus自动填充功能,还需要配置自动填充器。可以继承MetaObjectHandler类,并实现其中的方法,如insertFill()、updateFill()等,在这些方法中完成自动填充的逻辑。然后在Mybatis-plus的配置文件中配置自动填充器。 4. 实体类属性名和数据库字段名不一致 在mybatis-plus自动填充,会根据实体类的定义自动填充对应的字段值。如果实体类属性名和数据库字段名不一致,可能会导致自动填充失败。可以使用@TableField(value = "数据库字段名")注解解决这个问题。 5. 数据库类型问题 mybatis-plus自动填充功能依赖于Mybatis的TypeHandler机制和JDBC驱动等技术,如果数据库类型不受支持,可能会导致自动填充失效。 总之,如果发现mybatis-plus自动填充失效,需要仔细检查以上几个问题。如果无法自行解决,可以向mybatis-plus官方社区提出问题,或者寻求专业的技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值