我需要更新一個 Java 應(yīng)用程序,以便 SQL 更新依賴于“受影響的行”的計數(shù),而不是“找到的行”(長話短說)。我運行了使用 MySQL 數(shù)據(jù)庫的應(yīng)用程序測試套件,useAffectedRows=true果然,有很多失敗都出現(xiàn)此錯誤: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)據(jù)我所知,只有在一個事務(wù)中創(chuàng)建數(shù)據(jù)庫對象并將其保存到數(shù)據(jù)庫,然后在新事務(wù)中再次保存并且沒有字段發(fā)生更改(即無操作)時,才會發(fā)生這種情況。這種情況最常發(fā)生在級聯(lián)保存中。如果我在將對象保存到第二個事務(wù)中之前刷新對象或更改對象上的字段值,則一切正常。我假設(shè)發(fā)生這種情況是因為啟用會useAffectedRows導(dǎo)致這些類型的更新返回行0計數(shù),因為實際上沒有更新任何內(nèi)容,因此 Hibernate 認為更新失敗。我是否需要配置其他設(shè)置以使 Hibernate 能夠接受“無操作更新”,或者我是否需要更改以某種方式處理事務(wù)的方式?
1 回答

HUX布斯
TA貢獻1876條經(jīng)驗 獲得超6個贊
從連接器/J 配置屬性
使用受影響的行
連接到服務(wù)器時不要設(shè)置 CLIENT_FOUND_ROWS 標志(不符合 JDBC,將破壞大多數(shù)依賴“已找到”行與“受影響行”進行 DML 語句的應(yīng)用程序),但會導(dǎo)致“正確”更新計數(shù)從“ INSERT ... ON DUPLICATE KEY UPDATE”語句由服務(wù)器返回。
以及相關(guān)的
與 MySQL 不同,Vitess JDBC 驅(qū)動程序默認 useAffectedRows 為 true。值得注意的是,這破壞了 hibernate 的 saveOrUpdate() 和replicate() 方法,因為它們期望結(jié)果是匹配的行。
根據(jù)一些谷歌搜索,你不太可能得到一個簡單的修復(fù)。您是正在做非標準事情的人,并且由于 Hibernate 開發(fā)人員嘗試考慮各種奇怪的怪癖(更不用說這可能會影響整個設(shè)計)是不明智的,因此您必須要么想出一些非常丑陋的黑客,要么嘗試擺脫 useAffectedRows 屬性。
添加回答
舉報
0/150
提交
取消