如何在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)
请您分享解决方案以解决此问题。
答案 0 :(得分:0)
您正在尝试保存已存在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()