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

场景

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

示例

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

	@ApiModelProperty("修改时间")
	@TableField(fill = FieldFill.INSERT_UPDATE)
	private Date modifyDate;
@ApiModelProperty("是否删除")
private Boolean deleted;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

 
 
  • 1
  • 2
  • 3

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

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

 
 
  • 1
  • 2
  • 3

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

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

 
 
  • 1
  • 2
  • 3
  • 4

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

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

 
 
  • 1
  • 2
  • 3
  • 4
  • 5

总结

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

    public boolean update(T entity, Wrapper updateWrapper)

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

    • 所以,所传的实体最好不要select出来,而是新new一个实体,赋值id值和变动值(见上一个代码段),updateById方法会根据所传id更新变动值+自动填充字段。
    • 注意:@Version注解说明:更新时,实体对象的version属性必须有值,才会更新对应字段,所以new实体的方法,会使@version失效
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MyBatis-plus是一个优秀的持久层框架,它在MyBatis的基础上进行了扩展和增强。MetaObjectHandler是MyBatis-plus提供的一个接口,用于自动填充实体类中的字段值。但有时候我们可能会遇到MetaObjectHandler不生效的问题。 出现MetaObjectHandler不生效的问题可能有以下几个原因: 1. 没有正确配置MetaObjectHandler:在使用MyBatis-plus时,需要在配置文件中配置MetaObjectHandler的实现类,并将其注入到SqlSessionFactory中。确保配置正确,使得MyBatis-plus能够正确地识别和使用MetaObjectHandler。 2. 实体类没有使用@TableField注解:在需要自动填充的字段上,需要使用@TableField注解进行标记。确保实体类中需要自动填充的字段都使用了@TableField注,并设置了相应的属性值。 3. 字段名与列名不一致:如果实体类中的字段名与数据库表中的列名不一致,需要使用@TableField注解value属性指定数据库列名。确保字段名与数据库列名一致,以便MyBatis-plus能够正确地进行自动填充。 4. 数据库表没有设置默认值或触发器:如果需要自动填充的字段在数据库表中没有设置默认值或触发器,那么在插入或更新数据时,MetaObjectHandler也无法生效。确保数据库表中需要自动填充的字段设置了默认值或触发器。 如果以上几点都没有问题,但仍然遇到MetaObjectHandler不生效的问题,可以尝试检查MyBatis-plus的版本是否与其他依赖库存在冲突,或者查看日志文件以获取更多的错误信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值