Hibernate:启用 useAffectedRows 会导致无操作更新出现

我需要更新一个 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 能够接受“无操作更新”,或者我是否需要更改以某种方式处理事务的方式?


萧十郎
浏览 165回答 1
1回答

HUX布斯

从连接器/J 配置属性使用受影响的行连接到服务器时不要设置 CLIENT_FOUND_ROWS 标志(不符合 JDBC,将破坏大多数依赖“已找到”行与“受影响行”进行 DML 语句的应用程序),但会导致“正确”更新计数从“ INSERT ... ON DUPLICATE KEY UPDATE”语句由服务器返回。以及相关的与 MySQL 不同,Vitess JDBC 驱动程序默认 useAffectedRows 为 true。值得注意的是,这破坏了 hibernate 的 saveOrUpdate() 和replicate() 方法,因为它们期望结果是匹配的行。根据一些谷歌搜索,你不太可能得到一个简单的修复。您是正在做非标准事情的人,并且由于 Hibernate 开发人员尝试考虑各种奇怪的怪癖(更不用说这可能会影响整个设计)是不明智的,因此您必须要么想出一些非常丑陋的黑客,要么尝试摆脱 useAffectedRows 属性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java