当前使用版本(必须填写清楚,否则不予处理)
SpringBoot 2.0.4.RELEASE + MybatisPlus 3.3.0
该问题是怎么引起的?(最新版上已修复的会直接close掉)
数据表中包含更新时间和删除时间,删除采用逻辑删除,想在更新的同时自动填充更新时间,删除的同时自动填充删除时间,所以在更新时间和删除时间上都加了fill = FieldFill.UPDATE,理想情况是更新和删除互不影响,所以在自定义的MetaObjectHandler中做了判断,如果是删除就设置删除时间,结果删除的时候没有设置更新时间,更新时间就被更新为null了,反之亦然
重现步骤
1、新增表设计包含更新时间和删除时间 2、更新时间和删除时间都加上fill = FieldFill.UPDATE,并实现自动填充 3、逻辑删除是更新时间被null值覆盖
报错信息
没有报错信息,逻辑上不合理,希望可以得到优化解决
Comment From: zhuyuemings
或者有没有其他解决方案
Comment From: miemieYaho
https://mp.baomidou.com/guide/faq.html#%E9%80%BB%E8%BE%91%E5%88%A0%E9%99%A4%E4%B8%8B-%E8%87%AA%E5%8A%A8%E5%A1%AB%E5%85%85-%E5%8A%9F%E8%83%BD%E6%B2%A1%E6%9C%89%E6%95%88%E6%9E%9C
Comment From: zhuyuemings
这里并没有我所说的问题,我给你看下代码吧 `@Component @Log4j2 public class MybatisPlusMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { setIfNotExist(MybatisPlusConsts.CREATED_AT, new Date(), metaObject); setIfNotExist(MybatisPlusConsts.DELETED, SystemConsts.NO, metaObject); }
@Override
public void updateFill(MetaObject metaObject) {
//需要区分更新和删除
Object object = metaObject.getValue(MybatisPlusConsts.DELETED_BY);
if (object instanceof String && StringUtils.isNotBlank(object.toString())) {
//删除
setIfNotExist(MybatisPlusConsts.DELETED_AT, new Date(), metaObject);
} else {
//更新
setIfNotExist(MybatisPlusConsts.MODIFIED_AT, new Date(), metaObject);
}
}
private void setIfNotExist(String name, Object value, MetaObject metaObject) {
if (null == metaObject.getValue(name)) {
setFieldValByName(name, value, metaObject);
}
}
}`
Comment From: zhuyuemings
就是说更新时间和删除时间都标记了更新时自动填充,预期是我在更新的时候不需要填充删除时间,删除的时候不需要填充更新时间,结果我删除的时候不设置更新时间,更新时间就被null值填充覆盖了,我现在的折中方案是重写了deleteByIdWithFill,在里面用反射判断是否存在逻辑删除字段,有则赋值
Comment From: miemieYaho
自己写的删除就自己想办法吧
Comment From: zhuyuemings
我是想知道mybatis-plus里面有没有办法做到,即使字段标记了自动填充,但是我在MetaObjectHandler没有设置值就不填充
Comment From: miemieYaho
不填充就update为null咯