Grails重复异常处理

时间:2010-04-20 04:35:11

标签: 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:13,265 ERROR [JDBCExceptionReporter:101]重复输入'1'表示   key 2
23:41:13,281 ERROR [AbstractFlushingEventListener:324]   无法将数据库中的状态与会话同步   org.hibernate.exception.ConstraintViolationException:不能   执行JDBC批量更新   org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)   在   org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.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)

请您分享解决方案以解决此问题。

5 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

肯定不会因违反约束而抛出异常,而是object.save()应该返回null?即。

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

答案 2 :(得分:0)

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

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

但请记住:对于任何成员变量,任何约束违规都会导致ValidationException ...所以你必须区分自己。

修改:

如果您使用Grails 1.2 failOnError功能......

,则适用

答案 3 :(得分:0)

我正在寻找同样的问题,所以可能不是一个完整的答案,但你可以做的是强制验证并查看错误,找出案例并放置你想要的行动:

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

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

答案 4 :(得分:0)

可能应该有效:

container.CreateChildContainer()