YunaiV / ruoyi-vue-pro

🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城、CRM、ERP、AI 大模型等功能。你的 ⭐️ Star ⭐️,是作者生发的动力!
https://doc.iocoder.cn/
MIT License
27.93k stars 5.99k forks source link

为什么 mybatis-plus 这个 DefaultDBFieldHandler updateFill 为什么为空才进行更新 那不是应该有这个字段就更新么 #361

Closed Jinyilong closed 1 year ago

Jinyilong commented 1 year ago

碰到问题,请在 https://github.com/YunaiV/ruoyi-vue-pro/issues 搜索是否存在相似的 issue。

不按照模板提交的 issue,会被系统自动删除。

基本信息

你猜测可能的原因

(必填)我花费了 2-4 小时自查,发现可能的原因是:xxxxxx

复现步骤

第一步, 我使用 mysql-plus 更新的方法 orderMapper.updateById(orderDO);

第二步,
image

updater 和 update_time 没有进行自动更新 第三步, 通过debug 排查到updateFill 这个方法

@Override
public void updateFill(MetaObject metaObject) {
    // 更新时间为空,则以当前时间为更新时间
    Object modifyTime = getFieldValByName("updateTime", metaObject);
    if (Objects.isNull(modifyTime)) {
        setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }

    // 当前登录用户不为空,更新人为空,则当前登录用户为更新人
    Object modifier = getFieldValByName("updater", metaObject);
    Long userId = WebFrameworkUtils.getLoginUserId();
    if (Objects.nonNull(userId) && Objects.isNull(modifier)) {
        setFieldValByName("updater", userId.toString(), metaObject);
    }
}

为什么为空才进行更新? 既然是更新操作 那本来就肯定有值啊 现在为空才更新 不是更新了一个寂寞么

报错信息

带上必要的截图

Jinyilong commented 1 year ago
@Override
public void updateFill(MetaObject metaObject) {
    // 有更新时间,则以当前时间为更新时间
    if (metaObject.hasGetter("updateTime")) {
        setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }
    // 当前登录用户不为空,有更新人 ,则当前登录用户为更新人
    Long userId = WebFrameworkUtils.getLoginUserId();
    if (Objects.nonNull(userId) && metaObject.hasGetter("updater")) {
        setFieldValByName("updater", userId.toString(), metaObject);
    }
}

不是应该这样么

Minh-X commented 1 year ago

updateVO删除这个字段,入参不传就行了吧(我的理解是:有可能有需求就是需要手动改时间,方便区分吧)

Jinyilong commented 1 year ago

updateVO删除这个字段,入参不传就行了吧(我的理解是:有可能有需求就是需要手动改时间,方便区分吧)

orderDO 继承 BaseDo BaseDo 里面有 updateTime

Minh-X commented 1 year ago

updateVO删除这个字段,入参不传就行了吧(我的理解是:有可能有需求就是需要手动改时间,方便区分吧)

orderDO 继承 BaseDo BaseDo 里面有 updateTime

这是查询吧,写入的时候reqVO(updateVO、createVO)里面不带updateTime就行,或者手动把这个字段设置为null

Jinyilong commented 1 year ago

orderMapper.updateById

updateVO删除这个字段,入参不传就行了吧(我的理解是:有可能有需求就是需要手动改时间,方便区分吧)

orderDO 继承 BaseDo BaseDo 里面有 updateTime

这是查询吧,写入的时候reqVO(updateVO、createVO)里面不带updateTime就行,或者手动把这个字段设置为null

orderMapper.updateById 不是更新么 我现在手动设置字段设置为null 不是跟他自动更新的含义冲突了么

Minh-X commented 1 year ago

orderMapper.updateById

updateVO删除这个字段,入参不传就行了吧(我的理解是:有可能有需求就是需要手动改时间,方便区分吧)

orderDO 继承 BaseDo BaseDo 里面有 updateTime

这是查询吧,写入的时候reqVO(updateVO、createVO)里面不带updateTime就行,或者手动把这个字段设置为null

orderMapper.updateById 不是更新么 我现在手动设置字段设置为null 不是跟他自动更新的含义冲突了么

更新的时候不会有这个字段就自动更新,如果有这个字段就意味着你想要手动设置就用传入的值去更新;你看一下项目里面的XXXUpdateVO和XXXCreateReqVO里面不会有updateTime字段(比如UserUpdateReqVO)

Jinyilong commented 1 year ago

orderMapper.updateById

updateVO删除这个字段,入参不传就行了吧(我的理解是:有可能有需求就是需要手动改时间,方便区分吧)

orderDO 继承 BaseDo BaseDo 里面有 updateTime

这是查询吧,写入的时候reqVO(updateVO、createVO)里面不带updateTime就行,或者手动把这个字段设置为null

orderMapper.updateById 不是更新么 我现在手动设置字段设置为null 不是跟他自动更新的含义冲突了么

更新的时候不会有这个字段就自动更新,如果有这个字段就意味着你想要手动设置就用传入的值去更新;你看一下项目里面的XXXUpdateVO和XXXCreateReqVO里面不会有updateTime字段(比如UserUpdateReqVO)

所以这两个字段为什么要手动设置

YunaiV commented 1 year ago

1、do 自动设置的逻辑是,如果业务(Service)没有主动设置,则进行自动设置。如果业务设置了,就不覆盖。 2、不要直接从 db 查询到 do,然后在用这个 do 去 update,而是要 new 一个 do 出来去 update 想要的属性。