2010-04-20 2 views
2

Как поймать дубликаты ключевых исключений в Grails. при попытке сохранить существующее целое число для уникального ограничения столбца, генерируется ошибка при сохранении/обновлении записи.Grails Duplicate Обработка исключений

Также используется

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 [JDBCExceptionReporter: 101] Дублировать запись '1' для ключа 2
23: 41: 13,281 ОШИБКИ [AbstractFlushingEventListener: 324] Не удалось синхронизировать базы данных
состояния с сеансом орг .hibernate.exception.ConstraintViolationException: не удалось выполнить JDBC пакетного обновления на org.hibernate.exception.SQLStateConverter.convert (SQLStateConverter.java:94) в org.hibernate.exception.JDBCExceptionHelper.convert (JDBCExceptionHelper.java:66) по адресу 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. flush (SessionImpl.java:1027)

Не могли бы вы предложить решение, чтобы решить эту проблему.

ответ

0

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

  • Если идентификатор генерируется автоматически, не устанавливайте его вручную
  • Если идентификатор не генерируется автоматически, установите его на что-то другое, например max(id) + 1
+0

нет, идентификатор не сгенерированы автоматически и столбец является уникальным ключом. Его текстовое поле для ввода и когда пользователь вводит существующее целое число, он не сможет сэкономить. Это работает правильно, но в консоли я получал упомянутые ошибки. – Srinath

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 ... так что вы должны выделить себя.

Edit:

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

+0

да, но я на grails-1.1.2 – Srinath

+0

Хорошо, теперь есть две возможности: попробуйте обычную процедуру проверки Grails, например if (obj.validate()) {obj.save()} else {obj.errors .each {// doh, есть ошибки ...}} (например, Али G) или более простое и чистое обновление grails;) – codeporn

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) { 
    // ... 
} 
Смежные вопросы