一,问题
使用mybatisplus创建,修改时间自动填充功能时,发现新增创建时间,修改时间更新了,修改数据时,更新时间未更新
代码如下
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT)
private Date creationDate;
private String lastUpdatedBy;
/**
* 修改时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date lastUpdateDate;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 新增填充
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
this.fillStrategy(metaObject, "creationDate", new Date());
updateFill(metaObject);
}
/**
* 更新填充
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
this.fillStrategy(metaObject, "lastUpdateDate", new Date());
// this.strictUpdateFill(metaObject, "lastUpdateDate", LocalDateTime.class, LocalDateTime.now());
}
}
二,原因
@Override
public void updateFill(MetaObject metaObject) {
this.fillStrategy(metaObject, "lastUpdateDate", new Date());
this.strictUpdateFill(metaObject, "lastUpdateDate", LocalDateTime.class, LocalDateTime.now());
}
跟踪1
先看下自动更新的逻辑中两个方法,
方式1,fillStrategy 失败 本质原因:当该字段有值之后,自动填充不进行填充,里面的数据还是原值 方式2,strictUpdateFill 成功 不管是否有原值都强制执行更新
所以选择方式二
参考
Mybatis-plus自动填充不生效或自动填充数据为null原因及解决方案_java_脚本之家
跟踪2
经测试还是不行
原因如下
再次改动,如下
@Override
public void updateFill(MetaObject metaObject) {
// this.strictUpdateFill(metaObject, "lastUpdateDate", Date.class, new Date());
setFieldValByName("lastUpdateDate", new Date(), metaObject);
}
1.把 LocalDateTime.
class
, LocalDateTime.now() 改成Date
2.参考如下文档
方法换成 setFieldValByName,结果还是不行
跟踪3
重写方法,参考如下