文章目录
**
关于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.在配置了乐观锁的情况下,再进行自动填充功能配置,这样就无论哪种方法都可以使用了
自动填充功能配置: