关于mybatis-plus自动填充策略失效的原因


**

关于mybatis-plus自动填充策略失效的情况

**

在更新数据库的时候,发现update_time字段的自动填充失效了,实体里面的字段的注解是加上了的。 @TableField(value = “update_time”, fill = FieldFill.INSERT_UPDATE) 有可能的原因:mybatis配置文件MyBatisPlusConfig配置了乐观锁,乐观锁会让自动填充失效。 配置乐观锁之后updateById()方法会出现两种情况:

1、从数据库查出来的数据,无法进行自动填充

(注:没有乐观锁的时候是可以进行填充的,无论这个字段是null还是有值)

UserPoJo poJo = service.getById(id);
        poJo.setName(name);
        service.updateById(poJo);

无法进行填充可能有三种原因,如下 1)如果数据库里这个字段本来就是null,那么根据严格填充策略,null值是不进行填充的。 2)填充的数据类型和实体类定义的数据类型不一致。例如你的updateTime是 java.util.Date类型的,但是填充的是LocalDateTime,就会导致填充的数据为空。 3)如果数据库中的字段已经有值了,也不会填充。

2、直接new的对象,去更新数据库的数据,就会自动填充(无论这个字段是null还是有值)

UserPoJo poJo = new UserPoJo();
        poJo.setId(id);
        poJo.setName(name);
        service.updateById(poJo);

解决方案

1.不管有没有乐观锁,直接使用boolean update(T entity, Wrapper updateWrapper)方法

LambdaUpdateWrapper<UserPoJo> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(UserPoJo::getId, id);
        wrapper.set(UserPoJo::getName, name);
        //不会自动填充update_time
        //service.update(wrapper);
        //会自动填充update_time
        service.update(new UserPoJo(), wrapper);

2.不使用乐观锁,然后使用boolean updateById(T entity)方法

3.在配置了乐观锁的情况下,再进行自动填充功能配置,这样就无论哪种方法都可以使用了

自动填充功能配置:

经验分享 程序员 微信小程序 职场和发展