前言

今天在公司无聊闲来无事,就想找点事做,想起来之前有个服务有个bug,就是Mybatis-Plus在做增删改的时候创建时间和修改时间这些公共的字段没有自动填充,于是我就开始找bug了。。。

问题

在这里插入图片描述

从图片中大家可以清楚看到一条sql有4个字段的值是null

正是公共字段:

  • creationDate 创建时间
  • createdBy 创建人
  • lastUpdateDate 更新时间
  • lastUpdateBy 更新人

需要注意的是在触发自动填充之前是要在公共字段中配置枚举类的

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime creationDate;
    
    @TableField(fill = FieldFill.INSERT)
    private String createdBy;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime lastUpdateDate;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String lastUpdateBy;

配置这些什么意思想必没有必要解释了吧,直接看代码注释吧

public enum FieldFill {
    /**
     * 默认不处理
     */
    DEFAULT,
    /**
     * 插入时填充字段
     */
    INSERT,
    /**
     * 更新时填充字段
     */
    UPDATE,
    /**
     * 插入和更新时填充字段
     */
    INSERT_UPDATE
}

于是我就在Mybatis-Plus在配置自动填充的配置类中开始Debug

@Component
@Slf4j
public class BaseEntityMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("star fill ..........");
        UserBo user = AuthHolder.currentSysUser();
        String userBy = user.getId();
        this.strictInsertFill(metaObject, "createdAt", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "createdBy", String.class, userBy);
        this.strictInsertFill(metaObject, "updatedAt", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "updatedBy", String.class, userBy);
        this.strictInsertFill(metaObject, "lastUpdateDate", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "lastUpdateBy", String.class, userBy);
        this.strictInsertFill(metaObject, "creationDate", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        UserBo user = AuthHolder.currentSysUser();
        String userBy = user.getId();
        this.strictInsertFill(metaObject, "updatedAt", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "updatedBy", String.class, userBy);
        this.strictInsertFill(metaObject, "last_update_date", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "last_update_by", String.class, userBy);
    }
}

上面代码就是这个服务的自动填充配置,insertFill方法是新增出发填充,updateFill是修改自动填充

虽然加了@Component注解、日志、和断点,但是在Debug的时候发现并没有进入这段自动填充的代码,

在这里插入图片描述

大家从上图可以看到Insert语句依旧没有进入方法

解决方法

经过排查发现我的问题是在配置多数据源的地方出现的问题,少了一段红框的代码。

在这里插入图片描述

为什么没有进入自动填充的配置类?

答案:通俗点讲就是这边在配置数据源的时候做了局部的处理,把默认的机制给改了,需要手动指定实现MetaObjectHandler的类。

常见失效原因

我的这个问题还是比较难发现的,一般常见的原因如下几种

原创不易,转载请标注来源!

微信公众号:小航学Java

博客园:https://www.cnblogs.com/mrhang/

CSDN:https://blog.csdn.net/weixin_46040901

掘金:https://juejin.cn/user/4156577737093352

专注Java相关技术:SSM、Spring全家桶、微服务、MySQL、MyCat、集群、分布式、中间件、Linux、网络、多线程,偶尔讲点运维Jenkins、Nexus、Docker、ELK,偶尔分享些技术干货,致力于Java全栈开发!

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐