Rouleau de transaction après l'exception de JPA + Ressort
Je suis en utilisant Spring et JPA HIbernate-dessous. Lorsqu'un PersistenceException est jeté, j'ai envie de l'attraper et renvoyer le message d'erreur alors qu'il n'est pas propagé à l'appelant.
@Transactional
public String save(Object bean) {
String error = null;
try {
EntityManager entityManager = getEntityManager();
for (int i = 0, n = entities.size(); i < n; i ++) {
entityManager.merge(entities.get(i));
}
}
catch (PersistenceException e) {
error = e.getMessage();
}
return error;
}
Mais j'obtiens une exception en disant que javax.persistence.RollbackException: Transaction marked as rollbackOnly.
- je obtenir que la transaction doit être annulée après une exception, mais comment puis-je rouler en arrière quand j'ai attrapé l'exception et ne veux pas re-jeter?
OriginalL'auteur Tom Tucker | 2011-02-22
Vous devez vous connecter pour publier un commentaire.
En utilisant @Transactional s'il y a des RuntimeExceptions jeté dans la méthode, il va automatiquement effectuer la restauration. Vous n'avez pas besoin de faire manuellement. Vous ne devriez probablement pas attraper cette exception à tous et au lieu de le laisser passer à un niveau supérieur ExceptionHandler qui montre une certaine page d'erreur standard de l'utilisateur (pas la trace de la pile). Aussi votre méthode est marqué nulle, mais vous êtes de retour d'une Chaîne.
Ce qui sur le retrait de la try et catch? IMO il n'ya aucune raison pour vous de les attraper et manipuler l'exception puisque vous ne pouvez pas "réparer".
En fait, j'ai attraper une violation de contrainte et d'essayer de montrer un localisée message d'erreur sur le formulaire que l'utilisateur a utilisé pour envoyer les données.
OriginalL'auteur Robby Pond
Vous pouvez utiliser le Printemps Exception Traduction avec une coutume
PersistenceExceptionTranslator
de traduirePersistenceException
en quelque chose d'utile.Oh, btw, vous ne devriez pas utiliser
@Transactional
à la DAO. Les Transactions devraient être commencé au niveau du service.OriginalL'auteur Sean Patrick Floyd
Il semble qu'il n'y a aucun moyen de faire reculer l'échec d'une transaction gérée par Spring ORM. Le code indiqué dans la question, est une classe de service. L'extraction de la persistance de routine à une classe DAO et avoir la classe de service de la poignée
PersistenceExceptions
a fait le tour.OriginalL'auteur Tom Tucker
Utilisation
@Transactional(noRollbackFor={PersistenceException.class})
sur la méthode qui est en train de lancer une exception.En fait @TomTucker lorsque la transaction est annulée, l'exception sera pris en l'appelant de la méthode d'accès aux données d'exception.Dans votre exemple, si une excpetion est rejetée en arrière, après la transaction est annulée la méthode qui appelle la méthode save serait ce que pour l'accès aux données de l'objet exception (DataAccessException) mettre ce bloc dans votre appelant la méthode et peut intercepter l'exception et peut analyser et de faire une analyse de la valeur...
OriginalL'auteur Michal Bachman