本文针对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字段是否有值,都将该值更新。