Comment gérer JPA violations de contrainte unique?
Lorsqu'une unique contrainte est violée, une javax.persistence.RollbackException
est levée. Mais il pourrait y avoir plusieurs raisons à jeter un RollbackException
. Comment puis-je savoir qu'une contrainte unique a été violé?
try {
repository.save(article);
}
catch(javax.persistence.RollbackException e) {
//how to find out the reason for the rollback exception?
}
Vous devez vous connecter pour publier un commentaire.
Exception sont enchaînés, vous devez appeler
getCause()
de manière récursive pour obtenir de son fournisseur d'exception spécifique (et peut-être aller à laSQLException
) pour traduire en quelque chose de votre application peut gérer bien pour votre utilisateur. La suite vous l'impression que la chaîne de l'exception:Pour la gestion des exceptions et la "traduction", vous pourriez faire quelque chose comme ce qui Ressort n' (voir les différents
JpaDialect
classes, par exempleHibernateJpaDialect
pour vous faire une idée).Tout cela n'est pas agréable, ce code ne sera pas portable et de trouver quel attribut(s) origine de l'infraction ne sera pas facile. Ce en quelque sorte confirme qu'il n'y a pas de élégant et portable façon de traiter les violations de contrainte en JPA.
Utilisation
e.getCause()
à examiner quelle est la cause de la restauration.getCause().getMessag()
?SQLException,
vérifier l'erreur et SQLStatus. Mais certains frameworks comme Spring traduire ces vers quelque chose de plus significatif (DataIntegrityViolationException
).compilateur renvoie l'exception SQLIntegrityConstraintViolationException, tandis que d'essayer de violer la contrainte unique.
Utilisation suivantes bloc catch concept, afin de gérer correctement les exceptions.
Vous pouvez utiliser les éléments suivants :
Si vous utilisez le framework spring, alors vous pouvez utiliser :
org.springframework.dao.DataIntegrityViolationException
Si la norme JPA suivants peuvent être utilisés
org.hibernate.exception.ConstraintViolationException
Au niveau sql suivant peut être utilisé :
java.sql.SQLIntegrityConstraintViolationException
Cela pourrait très en retard pour vous, mais voici comment je l'ai résolu pour PostGres.
je pense que l'impression de la trace de la pile vous aidera à savoir. e.printStackTrace();
Vous pouvez le faire comme ceci :
Et afficher les informations d'exception.