记录JPA报错2.0
First Post:
Last Update:
Last Update:
记录JPA报错2.0
使用save()方法更新数据踩到的坑
1、不能更新数据
使用save()方法更新数据时注意:
若传入的实体对象id属性有值,则会匹配id进行更新操作;若id属性为空,则会自动新增一条数据到数据库。
但在我实际操作时,有时候save()方法传入的实体对象的id属性有值,却也是新插入了一条数据,这里的原因是save()方法不仅根据id是否为空来判定是否更新,还根据version版本号来判断是否是更新。
在执行插入语句时,注意把版本号写入就不会有这种问题了。
2、多次更新数据,报StaleObjectStateException异常
详细如下
1 | org.springframework.orm.ObjectOptimisticLockingFailureException: Object of class [GDAppointmentHisInfo] with identifier: optimistic locking failed; |
翻译:
1 | ObjectOptimisticLockingFailureException:带有标识符的类[GDAppointmentHisInfo]的对象:乐观锁定失败; |
原因:
网上给出的解释是StaleObjectStateException因为乐观锁以版本号来加锁,假设第一次更新时获取的数据库对象的版本号为1,执行更新操作之后,版本号变为2,而第二次更新时还是在第一次获取的数据库对象上更新(版本号还是1),因为其版本号已经改变,就抛出这个异常。
解决办法:
在第二次更新前,重新取数据库的对象,也就是每次执行更新、删除操作,要在最新的数据库对象上进行更新。
打赏
支付宝 | Alipay


微信 | WeChat

