您的位置:首页 > 其它

mybatis plus坑之 - updateById写法 导致 自动填充不生效

2020-01-14 13:24 1056 查看

场景

更新一个实体,只修改了普通字段值,对于自动填充的字段不生效。
这个问题困惑了两天,经过各种尝试,终于得知解决办法(见最后一个代码块)。

示例

现假设场景是软删除,只更新deleted字段,需要modifyDate自动更新为最新时间。
有以下两个字段做了自动填充:

@ApiModelProperty("修改时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date modifyDate;

@ApiModelProperty("是否删除")
private Boolean deleted;

此时需要软删除相关实体,写法如下:

//不生效
Boolean bol = ENTITY_SERVICE.update(null,
new UpdateWrapper<ENTITY>().eq("id", ENTITY_ID).set("deleted", true));

但是只更新了set过的delete字段,尝试换一种写法:

//生效
Boolean bol = ENTITY_SERVICE.update(getBaseMapper().selectById(ENTITY_ID),
new UpdateWrapper<ENTITY>().eq("id", ENTITY_ID).set("deleted", true));

此时modifyDate自动更新,于是再尝试查出实体,手动更新,如下:

//不生效
ENTITY ENTITY= getBaseMapper().selectById(ENTITY_ID);
ENTITY.setDeleted(true);
ENTITY_SERVICE.updateById(ENTITY);

结果又失效了,百思不得其解。。后来经过百度,尝试了又一种写法,只设置ID值和变动值,如下:

//生效
ENTITY ENTITY= new ENTITY();
ENTITY.setId(ENTITY_ID);
ENTITY.setDeleted(true);
ENTITY_SERVICE.updateById(ENTITY);

总结

  • 综上,针对使用update方法,如果想要自动填充生效,写法应类似代码块3.

    public boolean update(T entity, Wrapper updateWrapper)

  • updateById方法中所传的实体参数,针对自动填充的字段:
    如果字段值非空,则按照所传的值更新;
    如果字段值为空,则按照自动填充的规则更新。

    所以,所传的实体最好不要select出来,而是新new一个实体,赋值id值和变动值(见上一个代码段),updateById方法会根据所传id更新变动值+自动填充字段。
  • 注意:@Version注解说明:更新时,实体对象的version属性必须有值,才会更新对应字段,所以new实体的方法,会使@version失效
  • 点赞
  • 收藏
  • 分享
  • 文章举报
sgambler 发布了5 篇原创文章 · 获赞 3 · 访问量 511 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: