Comment puis-je reprendre la violation de la contrainte exception de EclipseLink?
Je suis en utilisant EclipseLink dans mon application web, et je vais avoir un moment difficile avec élégance la capture et la gestion des Exceptions qu'elle génère. Je vois de ce fil ce qui semble être un problème similaire, mais je ne vois pas comment contourner ou de le réparer.
Mon code ressemble à ceci:
public void persist(Category category) {
try {
utx.begin();
em.persist(category);
utx.commit();
} catch (RollbackException ex) {
//Log something
} catch (HeuristicMixedException ex) {
//Log something
} catch (HeuristicRollbackException ex) {
//Log something
} catch (SecurityException ex) {
//Log something
} catch (IllegalStateException ex) {
//Log something
} catch (NotSupportedException ex) {
//Log something
} catch (SystemException ex) {
//Log something
}
}
Quand persist() est appelée avec une entité qui viole une contrainte d'unicité, je reçois une explosion des exceptions qui sont capturés et enregistrés par le conteneur.
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504):
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: The statement
was aborted because it would have caused a duplicate key value in a unique or
primary key constraint or unique index identified by 'SQL110911125638570'
defined on 'CATEGORY'.
Error Code: -1
(etc)
J'ai essayé ce qui suit:
try {
cc.persist(newCategory);
} catch (PersistenceException eee) {
//Never gets here
System.out.println("MaintCategory.doNewCateogry(): caught: " + eee);
} catch (DatabaseException dbe) {
//Never gets here neither
System.out.println("MaintCategory.doNewCateogry(): caught: " + dbe);
}
Je me rends compte que l'utilisation de DataBaseException n'est pas portable, mais j'ai besoin de commencer quelque part. Les exceptions ne jamais se laisser prendre. Des suggestions?
Le DataBaseException classe est définie par org.eclipse, pas la spécification JPA. Donc, ce n'aurions probablement pas travailler (ou même de la compilation) avec un autre fournisseur JPA.
OriginalL'auteur AlanObject | 2011-09-12
Vous devez vous connecter pour publier un commentaire.
Il ressemble, je ne vais pas faire plus d'activité sur cette question, donc je vais poster mon travail et d'en rester là. Un certain nombre de recherches sur le web n'ai pas trouvé beaucoup de tout ce qui est utile. J'aurais pensé que ce est un cas d'école, mais aucun des tutoriels que j'ai trouvé le couvre.
Il s'avère que dans cette condition avec EclipseLink, à l'Exception que vous pouvez attraper lorsque le SQL de violation de contrainte est la RollBackException qui est le résultat de la em.commit() appel. J'ai donc modifié mes persistent méthode comme ceci:
Si l'appelant attrape le EntityExistsException et prend les mesures appropriées. Le journal remplit encore jusqu'à l'intérieur des exceptions, mais qui peut être coupée plus tard.
Je me rends compte que c'est un peu un abus de l'intention de la EntityExistsException qui est normalement utilisée lorsqu'une entité champ ID est ré-utilisé, mais pour les besoins de l'utilisateur de l'application, il n'a pas d'importance.
Si quelqu'un a une meilleure approche veuillez poster une nouvelle réponse ou un commentaire.
OriginalL'auteur AlanObject
EclipseLink ne devrait être jeter un PersitenceException ou un RollbackException en fonction de l'environnement et de l'ordre des opérations que vous appelez sur l'EntityManager.
Quel est votre niveau d'enregistrement? Il est probable que vous voyez ces exceptions connecté par EclipseLink, mais seulement jetés comme des causes de la RollbackException.
Vous pouvez désactiver l'enregistrement d'exception avec le PU de la propriété, mais pour des fins de diagnostic, il est généralement préférable de laisser EclipseLink connecter les exceptions.
OriginalL'auteur Gordon Yorke
Modifier votre persistence.xml ajout de la propriété suivante:
property name="eclipselink.exception-gestionnaire" value="votre.propre.package.chemin d'accès.YourOwnExceptionHandler"
Maintenant créer la classe YourOwnExceptionHandler (sur le bon package). Il nécessite de mettre en œuvre org.eclipse.la persistance.des exceptions.ExceptionHandler.
Créer un non-argument du constructeur et de la méthode exigée handleException(...).
À l'intérieur de cette méthode, vous pouvez intercepter les exceptions!
Alan, j'ai pu attraper la base de données des exceptions et des codes d'erreur. Cependant, je suis encore à essayer d'envoyer un message personnalisé à mon jsf page.
OriginalL'auteur Flávio Cruz
Je suis en utilisant le Printemps de Démarrage 1.1.9 + EclipseLink 2.5.2. C'est la seule façon que je peux attraper ConstraintViolationException. Notez que mon
handleError(ConstraintViolationException)
est très simple de mise en œuvre qui renvoie simplement la première violation qu'il trouve.Noter que ce code a été également requis lorsque je suis passé à Hibernate 4.3.7 et Hibernate Validator 5.1.3.
Il semble que l'ajout de
PersistenceExceptionTranslationPostProcessor exceptionTranslation()
à mon persistance JavaConfig la classe n'a pas d'effet.OriginalL'auteur Adam
Je l'utilise.
et ma fonction à partir de ci-dessus:
Avec qui je n'ai pas besoin d'un programme de validation pour chaque Persistent, sa commune dans mes Classes DAO.
OriginalL'auteur diego matos - keke