Grails重复异常处理

Grails重复异常处理,grails,Grails,如何捕获Grails中的重复键异常。尝试为唯一列约束保存现有整数时,在保存/更新记录时生成错误 也用 try{ object.save(flush:true) } catch(org.springframework.dao.DataIntegrityViolationException e){ println e.message } catch(org.hibernate.exception.ConstraintViolationException ex){ printl

如何捕获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错误[JDBCExceptionReporter:101]的重复条目“1” 键2
23:41:13281错误[AbstractFlushingEventListener:324] 无法将数据库
状态与会话同步 org.hibernate.exception.ConstraintViolationException:无法 在以下位置执行JDBC批处理更新: org.hibernate.exception.sqlstatecoverter.convert(sqlstatecoverter.java:94) 在 org.hibernate.exception.jdbceptionhelper.convert(jdbceptionhelper.java:66) 在 org.hibernate.jdbc.AbstractBatcher.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.flush(SessionImpl.java:1027)


您可以分享解决此问题的解决方案吗。

您正在尝试保存一个id已存在的记录

  • 如果id是自动生成的,不要手动设置
  • 如果id不是自动生成的,请将其设置为其他值,例如
    max(id)+1

当然不应该因为约束冲突而引发异常,但是object.save()应该返回null吗?i、 e

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

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

但请记住:任何成员变量的任何约束冲突都可能导致ValidationException。。。所以你必须与众不同

编辑:


这适用于,如果您使用Grails 1.2 FailOneError功能…

我正在寻找相同的问题,因此可能不是一个完整的答案,但您可以做的是强制验证并查找错误,确定案例并采取您想要的措施:

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

还请注意,错误是:className.propertyName.unique

可能它应该工作:

import org.springframework.dao.DuplicateKeyException

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

否,id不是自动生成的,列是唯一的键。它是一个要输入的文本字段,当用户输入现有整数时,它将无法保存。这是正确的,但在控制台中我得到了提到的错误。是的,但我在grails-1.1.2Ok上,现在有两种可能性:要么尝试常见的grails验证过程,如if(obj.validate()){obj.save()}或者{obj.errors.each{//doh,有错误…}(如Ali G所述)或者更简单更干净的“grails升级”;)
import org.springframework.dao.DuplicateKeyException

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