2010-04-13 37 views
0

喜IM使用的HibernateDaoSupport從我的DAO從春&彈簧WS & 冬眠&的Postgres誰將會在一個國家申請使用的項目工作(意味着很多用戶)用的SQLException處理spring,hibernate的和Postgres的

實際上,每個來自hibernate的異常都會自動轉換成一些特定的Spring dataAccesException。

我有一個關於dabatase關鍵字的表&對關鍵字的唯一約束: 不允許有重複的關鍵字。

我發現了兩種方法來處理插入道: 1-在插入之前手動檢查重複(使用select)。我的意思是spring事務將具有SERIALIZABLE隔離級別。最明顯的缺點是,我們現在2個查詢一個簡單的insert.Advantage:獨立於數據庫的

2 - 讓插件不見了&漁獲SQLEXCEPTION &將其轉換爲一個用戶友好的消息&錯誤代碼到最終消費者的我們網頁服務。

解決方案2: Spring已經開發出一種方法來將特定的豁免轉化爲定製的異常。 參見http://www.oracle.com/technology/pub/articles/marx_spring.html

在我的情況下,我會有一個ConstraintViolationException。

理想情況下,我想編寫一個自定義的SQLExceptionTranslator以使用DuplicateWordException映射數據庫中的重複單詞約束。

但我可以在同一張桌子上有許多獨特的約束。因此,我必須獲取SQLEXceptions的消息才能找到例如在 create table「uq_duplicate-constraint」中聲明的約束名稱。現在我對數據庫有很強的依賴性。

預先感謝您的回答&原諒我的英文不好(這不是我的母語)

+0

你的帖子中是否有任何問題?你想達到什麼目的? – zoidbeck 2010-04-13 22:45:04

回答

0

在我的經驗,它始終是最好有你的數據驗證在你的應用程序,而不是依賴於數據庫。這樣可以將數據庫的角色限制爲數據存儲的角色,這意味着業務邏輯不會跨兩層分佈。

當你有一個數據庫事務會同時打破兩個約束時會發生什麼?在這種情況下,您的異常映射方法將僅捕獲第一次失敗,而不是一些可以顯示嘗試保存的數據驗證問題的驗證代碼。