2015-06-10 38 views
2

我正在開發一個使用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.找到一種處理數據庫級別的這種情況(完整性約束......)的方法 - 如果有的話,我會欣賞更多的建議

+0

您是否考慮過DiSol的建議?你可以重新連接(合併)你的實體到一個新的會話? –

回答

4

您不能,您的交易已標記爲回滾,即使沒有重複刪除,它也會失敗。

解決方案是在數據庫中執行它們之前驗證數據/操作。

但你說過你不想要它。

「驗證大量可能的更改會導致性能問題」但是,驗證它們不會導致不一致和錯誤的保存狀態(如果您有驗證限制,難以/不可能在數據庫中實現)。

「oracle數據庫可以爲我做得更好」我不同意。除了外鍵,非空和其他一些約束外,基於Java的驗證更加靈活和強大。

「我不想強制用戶執行特定的操作順序。」但是,您希望允許他們刪除不應刪除的內容,然後在10分鐘後嘗試保存可能相互依賴的累積更改(並假定刪除將成功)時發生錯誤。我確信,用戶在嘗試執行刪除操作後會很樂意收到錯誤信息,以免徒勞失去10分鐘。

我的觀點和建議是,您應該在指示Hibernate刪除實體之前進行驗證。

+0

「_But但是不驗證它們可能會導致不一致和錯誤的保存狀態(如果您有驗證約束在數據庫中很難/不可能實現)_」 這是不準確的,因爲在成功刷新到數據庫時,它意味着狀態是正確的(至少從數據完整性的角度來看),我想提一下,有些情況下我們正在驗證與業務規則相關的東西。 「 – AHO

+0

」__除了外鍵,不是空和其他一些限制,基於Java的驗證更加靈活和強大。「我同意你的看法,但這種情況是一個簡單的外鍵,據我所知數據庫的強大功能之一是數據完整性,否則,如果我在代碼中驗證了所有 \t爲什麼我應該定義非null和外鍵,我只能配置我的hibernate以使用正確的關係和在數據庫層面沒有定義 - 我相信這種方法是錯誤的。 – AHO

+0

_「但您希望允許他們刪除不應刪除的內容,並在10分鐘後提示錯誤,以便在他們嘗試保存可能相互依賴的累積更改時(並假定刪除將成功) 。我確信,用戶在嘗試執行刪除操作後會很樂意收到錯誤信息,以免徒勞失去10分鐘。「 \t不,我想讓用戶刪除一些他可以刪除的東西刪除並給他以後修復錯誤數據的能力... – AHO

1

您可以將模型合併到新會話中。你試過了嗎?

相關問題