gpt4 book ai didi

java - Hibernate:启用 useAffectedRows 导致无操作更新的 OptimisticLockExceptions

转载 作者:行者123 更新时间:2023-11-29 07:18:33 30 4
gpt4 key购买 nike

我需要更新 Java 应用程序,以便 SQL 更新依赖于“受影响的行”而不是“找到的行”的计数(长话短说)。我运行了应用程序的测试套件,该套件使用带有 useAffectedRows=true 的 MySQL 数据库,果然,有很多失败的错误:

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 可以使用“无操作更新”,或者我是否需要更改以某种方式处理事务的方式?

最佳答案

来自 Connector/J Configuration Properties

useAffectedRows

Don't set the CLIENT_FOUND_ROWS flag when connecting to the server (not JDBC-compliant, will break most applications that rely on "found" rows vs. "affected rows" for DML statements), but does cause "correct" update counts from "INSERT ... ON DUPLICATE KEY UPDATE" statements to be returned by the server.

related

The Vitess JDBC driver defaults useAffectedRows to true, unlike MySQL. Notably, this breaks hibernate's saveOrUpdate() and replicate() methods because they expect the result to be matched rows.

根据一些谷歌搜索,你不太可能得到一个简单的修复。你是那个做非标准事情的人,因为 Hibernate 开发人员试图考虑各种奇怪的怪癖是不明智的(更不用说这可能会影响整个设计),你必须要么想出一些非常丑陋的技巧,要么尝试摆脱 useAffectedRows 属性。

关于java - Hibernate:启用 useAffectedRows 导致无操作更新的 OptimisticLockExceptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57789141/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com