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 • 里面的回答

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

你可能感兴趣的:(Java,r2dbc,mysql,springboot3,ReactiveCrudRep,save)