2014-12-04 69 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