R2dbc Failed to update table []. Row with Id [] does not exist(己解决)

配置:SpringBoot3+R2DBC+MYSQL 

描述:在使用ReactiveCrudRepository的save方法保存实体时,正常有值为更新,但我的情况变成了只要有值就报错:Failed to update table []. Row with Id [] does not exist。并且数据库中是明明是有该Id对应的记录的。

参考文章1:无法解决问题:https://blog.csdn.net/luoyeyeyu/article/details/122321633

参考文章2:无法解决问题:Spring Data R2DBC响应式操作MySQL

最后来说我的解决办法:

发现R2DBC并不存在网上说的Id列有值不更新,无值不保存的问题。报这个错误完全是误报

排查一:要保存的实体的值和数据库中要的值不匹配,然后报了这个错误。

排查二:如果先查询,然后再保存。即使用查询的结果,然后修改内容,然后save就容易报:Row with Id [] does not exist。解决办法:不要在查询的结果里面直接更改,而是新建一个对象,然后将查询的内容赋值给新对象或你自己的操作,然后再保存新建的这个对象

排查三:众所周知,执行 repository执行save方法时,有可能是更新也有可能是创建一条新记录,它判断的标准是Id是否为空,如果为空,执行的是insert方法,所以Id不为空即执行的是update方法(可以debug可以看到具体执行的SQL)。如果此时,一个实体对象设置了Id,但表中又没有这条记录就会报Id不存在的错误。(因为R2dbc执行的是 update xx=xx where id=xx)方法,而Id又不存在,所以就报错:Row with Id [] does not exist。

ps:如果我想要insert一个实体,并且又想指定其Id怎么办呢。即Insert带Id的实体,使用以下办法,继承implements Persistable<>类,然后重写:isNew的方法,自行决定什么情况下执行Insert方法

中文例子:https://developer.aliyun.com/ask/267514

英文例子:RajeshSamson commented on Jun 17, 2020 • 里面的回答

有碰到就这几种情况,希望对你有用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值