亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Hibernate:啟用 useAffectedRows 會導致無操作更新出現

Hibernate:啟用 useAffectedRows 會導致無操作更新出現

蕭十郎 2023-07-13 14:10:24
我需要更新一個 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 能夠接受“無操作更新”,或者我是否需要更改以某種方式處理事務的方式?
查看完整描述

1 回答

?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

從連接器/J 配置屬性

使用受影響的行

連接到服務器時不要設置 CLIENT_FOUND_ROWS 標志(不符合 JDBC,將破壞大多數依賴“已找到”行與“受影響行”進行 DML 語句的應用程序),但會導致“正確”更新計數從“ INSERT ... ON DUPLICATE KEY UPDATE”語句由服務器返回。

以及相關的

與 MySQL 不同,Vitess JDBC 驅動程序默認 useAffectedRows 為 true。值得注意的是,這破壞了 hibernate 的 saveOrUpdate() 和replicate() 方法,因為它們期望結果是匹配的行。

根據一些谷歌搜索,你不太可能得到一個簡單的修復。您是正在做非標準事情的人,并且由于 Hibernate 開發人員嘗試考慮各種奇怪的怪癖(更不用說這可能會影響整個設計)是不明智的,因此您必須要么想出一些非常丑陋的黑客,要么嘗試擺脫 useAffectedRows 屬性。


查看完整回答
反對 回復 2023-07-13
  • 1 回答
  • 0 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號