我正在開發一個使用JSF和休眠作爲其ORM的大型Web應用程序。 我的Hibernate Session很長(用戶只能做在屏幕上修改的大量和改變,只會是對DB持久性時,他會按保存按鈕) 我最近與回滾的問題掙扎/取消用戶修改並尋找不同的解決方案和方法。如何在休眠狀態下處理/恢復數據庫完整性約束衝突異常?
我想從違反約束異常中恢復(「ORA-02292:誠信約束」)。
考慮以下情形:
有一個表「X」有記錄「X」和表「Y」有記錄「Y」 - 其中「x」由外鍵「Y」依賴。 用戶試圖刪除記錄的「Y」,雖然有一個未來可能的完整性約束違反了這一步, 我沒有拋出任何異常,因爲用戶稍後能夠解決它,只有當他將無法修復它並嘗試保存屏幕數據庫將拋出一個異常,將彙總到用戶界面。
我找不到從這個違規恢復的好方法。
在保存過程中,在嘗試刪除記錄'y'後,數據庫按預期啓動「ORA-02292:完整性約束」異常。
我的問題是,如果發生這樣的錯誤,用戶也通過選擇而不是「y」的另一個記錄固定的外鍵約束,Hibernate會認不出來了,因爲據我所知它仍然會先嚐試刪除「Y」(因爲的動作隊列),並在涉及到用另一個實體替換'y'的動作之前失敗。
所以發生了什麼事情是,DB保持射擊例外,而試圖保存更改,我無法找到一個方法來解決它,而無需刷新整個屏幕(這意味着新的Hibernate Session失去了所有用戶的新數據) 。 看起來行動隊列保存了刪除操作,即使調用Session「evict」或「clear」方法也不會清除它。
我知道我可以在提交它們之前驗證更改,它可以工作,但我對這種解決方案不感興趣,因爲:驗證大量可能的更改會導致性能問題,此外我相信Oracle DB可以爲我做得更好。 2.我不想強制用戶執行特定的操作順序。
UPDATE:
我覺得我應該流下應用要求一些輕:
申請建的方式,以數據庫提交更改只能發生在保存階段 - 這是一個用戶需求,不幸的是它不可用於討論,
其背後的想法是,用戶希望在沒有特定種類的訂單的情況下進行更改,並在按下保存按鈕之前每當他想要修復錯誤的數據集時。
由於這一要求,驗證也最好發生在保存階段。
我知道在Dragan Bozanovic指出波紋管時可以立即驗證每一個用戶修改,但正如我所說這不是用戶首選的方式。
所以,當我看到它,我可以在三種不同的方式解決這個問題:
驗證所有的保存期的修改 - 正如我所說的它可以是一個性能問題,因爲可以有很多驗證製造。
2.立即驗證每個用戶修改 - 這不是用戶的首選選項,但必須做。
3.找到一種處理數據庫級別的這種情況(完整性約束......)的方法 - 如果有的話,我會欣賞更多的建議。
您是否考慮過DiSol的建議?你可以重新連接(合併)你的實體到一個新的會話? –