2010-04-20 5 views
2

Comment intercepter des exceptions de clé en double dans Grails. Lorsque vous tentez d'enregistrer un entier existant pour une contrainte de colonne unique, l'erreur est générée lors de la sauvegarde/mise à jour d'un enregistrement.Grails Dupliquer Gestion des exceptions

également utilisé

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 
} 

Mais incapable d'attraper cette question.

23: 41: 13,265 ERROR [JDBCExceptionReporter: 101] entrée en double '1' pour touche 2
23: 41: 13281 ERREUR [AbstractFlushingEventListener: 324] Impossible de synchroniser la base de données
état avec la session org .hibernate.exception.ConstraintViolationException: Impossible exécuter la mise à jour batch JDBC à org.hibernate.exception.SQLStateConverter.convert (SQLStateConverter.java:94) à org.hibernate.exception.JDBCExceptionHelper.convert (JDBCExceptionHelper.java:66) at 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)

Pourriez-vous s'il vous plaît partager la solution pour résoudre ce problème.

Répondre

0

Vous essayez d'enregistrer un enregistrement avec un ID existant déjà.

  • Si id est généré automatiquement, ne définissez pas manuellement
  • Si id est pas généré automatiquement, mettez-le à autre chose, par exemple max(id) + 1
+0

non, id n'est pas généré automatiquement et la colonne est une clé unique. C'est un champ de texte à entrer et lorsque l'utilisateur entre nombre entier existant, il ne parviendra pas à enregistrer. Cela fonctionne correctement, mais dans la console je recevais les erreurs mentionnées. – Srinath

0

sûrement pas exception devrait être jeté pour violation de contrainte, mais plutôt object.save() devrait retourner null? à savoir

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

Si vous avez défini le caractère unique grâce à une contrainte Grails, vous devez chercher un ValidationException. Ceci est levé quand object.validate() échoue; La validation est effectuée avant tout object.save(). Mais rappelez-vous: Toute violation de contrainte, pour n'importe quelle variable membre, peut provoquer une exception ValidationException ... donc vous devez vous distinguer.

Edit:

Cela vaut, si vous utilisez la fonction failonerror Grails 1.2 ...

+0

ouais, mais je suis sur grails-1.1.2 – Srinath

+0

Ok, maintenant il y a deux possibilités: soit essayer la procédure de validation Grails commune comme si (obj.validate()) {obj.save()} else {obj.errors .each {// doh, il y a des erreurs ...}} (comme Ali G mentionné) ou un 'grails upgrade' plus simple et plus propre;) – codeporn

0

Je cherche le même problème alors peut-être pas une réponse complète, mais ce que vous pouvez faire est de forcer la validation et regarder dans les erreurs, identifier le cas et placer les actions que vous voulez:

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

également noter que l'erreur est: className.propertyName.unique

0

Peut-être il devrait fonctionner:

import org.springframework.dao.DuplicateKeyException 

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