2010-04-20 107 views
2

如何在Grails中捕获重复的键异常。当试图为唯一列约束保存现有整数时,在保存/更新记录时会生成错误。Grails重复异常处理

还用

try{ 
    object.save(flush:true) 
} 
catch(org.springframework.dao.DataIntegrityViolationException e){ 
    println e.message 
} 
catch(org.hibernate.exception.ConstraintViolationException ex){ 
    println e.message 
} 
catch(Exception e){ 
    println e.message 
} 

但无法赶上这个问题。

23:41:13265 ERROR 41:13281 ERROR [AbstractFlushingEventListener:324] 无法同步数据库
状态与会话 有机[JDBCExceptionReporter:101]为 键2
23重复条目 '1' .hibernate.exception.ConstraintViolationException:在 org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94) 在 org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66无法 执行JDBC批处理更新) at org.hibernate.jdbc.Abs tractBatcher.executeBatch(AbstractBatcher.java:275) 在 org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) 在 org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168) 在 org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 在 org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 在org.hibernate.impl.SessionImpl。冲洗(SessionImpl.java:1027)

请您分享解决方案来解决这个问题。

回答

0

您正在尝试使用已存在的ID保存记录。

  • 如果生成的自动识别,不用手动设置它
  • 如果ID不是自动生成的,它设置为别的东西,例如max(id) + 1
+0

没有,身份证是不是自动生成和列是一个独特的密钥。它是一个输入的文本字段,当用户输入现有的整数时,它将无法保存。这工作正常,但在控制台中,我收到了错误。 – Srinath 2010-04-20 06:00:36

0

当然也不例外应抛出违反约束,而是object.save()应该返回null?即

if(object.save() == null) { 
    // save failed 
} else { 
    // save succeeded 
} 
0

如果通过Grails约束定义了唯一性,则必须查找ValidationException。当object.validate()失败时会引发这个问题;验证在任何object.save()之前完成。

try { 
    object.save(failOnError: true) 
} 
catch(ValidationException ve) { 
    // Do something ... 
} 

但请记住:任何违反约束,对于任何成员变量都可能导致ValidationException ...因此您必须区分自己。

编辑:

这适用,如果你使用Grails 1.2 failOnError功能...

+0

是的,但我在grails-1.1.2 – Srinath 2010-04-20 18:58:52

+0

好吧,现在有两种可能性:要么尝试普通的Grails验证程序,如if(obj.validate()){obj.save()} else {obj.errors .each {// doh,有错误...}}(比如Ali G提到的)或更简单更清洁的'grails升级';) – codeporn 2010-04-21 09:14:12

0

我找了同样的问题,所以也许不是一个完整的答案,但你可以做的是强制验证,并期待中的错误,查明案情,并把你想要的操作:

if(instance.validate()) { 
    //everything ok 
} else { 
    instance.errors.each { 
      //identify the case and place actions 
    } 
} 

而且注意,错误是:className.propertyName.unique

0

也许它应该工作:

import org.springframework.dao.DuplicateKeyException 

try { 
    domainInstance.save(flush: true) 
} catch(DuplicateKeyException e) { 
    // ... 
}