Обработка исключений Grails Duplicate - PullRequest
3 голосов
/ 20 апреля 2010

Как отловить дубликаты исключений в 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 ОШИБКА [JDBCExceptionReporter: 101] Дублирующая запись '1' для ключ 2
23: 41: 13,281 ОШИБКА [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 голосов
/ 10 марта 2016

Возможно, это должно работать:

import org.springframework.dao.DuplicateKeyException

try {
    domainInstance.save(flush: true)
} catch(DuplicateKeyException e) {
    // ...
}
0 голосов
/ 05 декабря 2014

Я ищу ту же проблему, поэтому, возможно, не полный ответ, но что вы можете сделать, это вызвать проверку и посмотреть на ошибки, определить случай и разместить нужные действия:

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

Также обратите внимание, что ошибка: className.propertyName.unique

0 голосов
/ 20 апреля 2010

конечно, нет исключения, которое должно быть выброшено для нарушения ограничения, но скорее object.save () должен вернуть нуль т.е.

if(object.save() == null) {
    // save failed
} else {
    // save succeeded
}
0 голосов
/ 20 апреля 2010

Если вы определили уникальность с помощью ограничения Grails, вам нужно искать исключение ValidationException. Это бросается, когда object.validate () терпит неудачу; Проверка выполняется перед любым object.save ().

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

Но помните: любое нарушение ограничения для любой переменной-члена может вызвать исключение ValidationException ... поэтому вы должны различать себя.

Редактировать:

Это применимо, если вы используете функцию Grails 1.2 failOnError ...

0 голосов
/ 20 апреля 2010

Вы пытаетесь сохранить запись с идентификатором, который уже существует.

  • Если идентификатор генерируется автоматически, не устанавливайте его вручную
  • Если идентификатор не генерируется автоматически, установите его на другое значение, например max(id) + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...