2014-12-04 15 views
0

我有簡單的領域:如何捕獲grails.validation.ValidationException?

package app 

    class Customers { 
    String CUSTOMER 
    String NOTE 

    static mapping = { 
     version false 
     id column: 'ID_CUSTOMER', type: 'long', 
     generator: 'sequence', 
     params: [sequence: 'CUSTOMER_SEQ'] 
    } 

    static constraints = { 
     CUSTOMER(nullable: false, blank: false, unique: ['NOTE']) 
     NOTE(nullable: true, blank: true) 
    } 
} 

列和約束正確地在數據庫中創建的(我想在客戶的約束,並注意在一起),但,不是得到:

grails.validation.**ValidationException** 

我越來越:

Message: Hibernate operation: could not execute statement; SQL [n/a]; ORA-00001: unique constraint (TEST2.UNIQUE_CUSTOMER_NOTE) violated 
; nested exception is java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (TEST2.UNIQUE_CUSTOMER_NOTE) violated 

我不應該得到ValidationException約束違反時ED?

控制器代碼是由generate-all腳本生成的標準自動代碼。

回答

1

您不顯示任何控制器代碼 - 您是否檢查返回值validate()save()調用(或使用hasErrors())並重定向回以便用戶修復錯誤?

如果您更改一個或兩個值並且它們不再獨一無二,但您不要撥打validate()save(),您將看到的內容將會發生。這是因爲在請求結束時,所有修改後的實例都會在數據庫中更新,因爲會話被刷新,Hibernate使用其原始值的緩存副本來檢測尚未保存和刷新的修改/髒實例。

如果您更改了一個值但未計劃保存更改(例如,如果您只爲渲染GSP設置了值),請確保通過調用discard()從會話中清除實例--Hibernate不會嘗試推送如果實例不再附加到會話,則進行這些更改。

+0

奇怪的部分是我有ValidationException當我試圖保存到兩個已存在的列值,但SQLIntegrityConstraintViolationException當只有一個已存在。 – marek 2014-12-04 17:59:47

+0

數據庫中有行(ff,ff),另一個保存給出ValidationException – marek 2014-12-04 18:01:36

+0

數據庫中有(ff,null),另一個保存給出SQLIntegrityConstraintViolationException – marek 2014-12-04 18:02:38