首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何抓住grails.validation.ValidationException?

如何抓住grails.validation.ValidationException?
EN

Stack Overflow用户
提问于 2014-12-04 11:48:31
回答 1查看 1.1K关注 0票数 0

我有一个简单的域:

代码语言:javascript
运行
复制
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) 
   }
}

列和约束是在数据库中正确创建的(我希望将对客户的约束和注释放在一起),而不是获得:

代码语言:javascript
运行
复制
grails.validation.**ValidationException**

我得到了:

代码语言:javascript
运行
复制
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吗?

控制器代码是由generate-all脚本生成的标准自动代码。

EN

回答 1

Stack Overflow用户

发布于 2014-12-04 12:35:35

您没有显示任何控制器代码--您是在检查validate()save()调用的返回值(或者使用hasErrors())并重定向回定向以便用户修复错误吗?

如果您更改了一个或两个值,并且它们不再是唯一的,但您不会调用validate()save(),您所看到的就会发生。这是因为在请求结束时,任何修改的实例都将在数据库中更新,因为会话会被刷新,Hibernate使用原始值的缓存副本来检测尚未保存和刷新的修改/脏实例。

如果您更改一个值,但不打算保存更改(例如,如果您只为呈现GSP设置值),请确保通过调用discard()将实例从会话中删除--如果实例不再附加到会话上,Hibernate将不会尝试推送这些更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27293321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档