我需要更新一个 Java 应用程序,以便 SQL 更新依赖于“受影响的行”的计数,而不是“找到的行”(长话短说)。我运行了使用 MySQL 数据库的应用程序测试套件,useAffectedRows=true
果然,有很多失败都出现此错误:
javax.persistence.OptimisticLockException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
实际原因似乎是这个异常:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
据我所知,只有在一个事务中创建数据库对象并将其保存到数据库,然后在新事务中再次保存并且没有字段发生更改(即无操作)时,才会发生这种情况。这种情况最常发生在级联保存中。如果我在将对象保存到第二个事务中之前刷新对象或更改对象上的字段值,则一切正常。
我假设发生这种情况是因为启用会useAffectedRows
导致这些类型的更新返回行0
计数,因为实际上没有更新任何内容,因此 Hibernate 认为更新失败。
我是否需要配置其他设置以使 Hibernate 能够接受“无操作更新”,或者我是否需要更改以某种方式处理事务的方式?
HUX布斯
相关分类