记录JPA报错2.0

First Post:

Last Update:

记录JPA报错2.0

使用save()方法更新数据踩到的坑
1、不能更新数据

使用save()方法更新数据时注意:
若传入的实体对象id属性有值,则会匹配id进行更新操作;若id属性为空,则会自动新增一条数据到数据库。

但在我实际操作时,有时候save()方法传入的实体对象的id属性有值,却也是新插入了一条数据,这里的原因是save()方法不仅根据id是否为空来判定是否更新,还根据version版本号来判断是否是更新。

在执行插入语句时,注意把版本号写入就不会有这种问题了。
2、多次更新数据,报StaleObjectStateException异常

详细如下

1
2
org.springframework.orm.ObjectOptimisticLockingFailureException: Object of class [GDAppointmentHisInfo] with identifier: optimistic locking failed;
nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

翻译:

1
2
ObjectOptimisticLockingFailureException:带有标识符的类[GDAppointmentHisInfo]的对象:乐观锁定失败;
嵌套异常org.hibernate。StaleObjectStateException:行被另一个事务更新或删除(或者未保存值映射不正确)

原因:
网上给出的解释是StaleObjectStateException因为乐观锁以版本号来加锁,假设第一次更新时获取的数据库对象的版本号为1,执行更新操作之后,版本号变为2,而第二次更新时还是在第一次获取的数据库对象上更新(版本号还是1),因为其版本号已经改变,就抛出这个异常。

解决办法:
在第二次更新前,重新取数据库的对象,也就是每次执行更新、删除操作,要在最新的数据库对象上进行更新。

打赏
支付宝 | Alipay
微信 | WeChat