当前使用版本(必须填写清楚,否则不予处理)

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咯