Mise en veille prolongée (JPA): comment gérer StaleObjectStateException lorsque plusieurs objet a été modifié et engagée
Considérer le scénario:
Un Db transaction passer plus d'une rangée de tables différentes avec la gestion des versions.
Par exemple:
Un shopLists et des produits. Où un shopList peut contenir des produits (avec leur montant dans la shoplist) et les produits ont leur stock actuel.
Quand j'ai insérer ou modifier un shopList, je veux le stock de ces produits dans le shopList être mis à jour pour maintenir le stock de consistant.
Pour ce faire, j'ai ouvert une transaction, insertion/mise à jour le shopList, mise à jour des stocks pour chaque produit (delta), puis de valider la transaction. Pas grand-chose jusqu'à maintenant.
Cependant, d'autres utilisateurs peuvent avoir mis à jour un ou plusieurs des produits en commun. Ou même mis à jour le shopList lui-même. Dans les deux cas, je voudrais obtenir un StaleObjectStateException lors de la validation de la transaction.
Question est: est-il un moyen pour déterminer la table qui a causé la StaleObjectStateException?
Dans le cas où le produit a provoqué l'exception, j'ai pu actualiser toutes les saisons des produits de la DB et réappliquez le stock des deltas. Et c'est bien.
Dans le cas où le shopList a provoqué l'exception, il serait préférable de simplement signaler le problème à l'utilisateur, de sorte qu'il pourrait recommencer.
Merci beaucoup pour votre aide.
OriginalL'auteur Marcus | 2011-01-29
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé comment.
Tout d'abord:
la JPA (ou la veille prolongée elle-même) enveloppe de l'org.mise en veille prolongée.StaleObjectStateException exception javax.la persistance.OptimisticLockException.
Donc, si vous voulez attraper l'exception au droit, aller pour OptimisticLockException.
Deuxième:
Hibernate ne jeter le OptimisticLockException lorsque vous appelez la méthode EntityManager Rincer avant de s'engager. Si vous appelez de s'Engager directement, vous obtiendrez une autre exception à la place (j'ai oublié lequel). Considérant presque tout le monde attrape les exceptions émises par la méthode de validation et aller pour une annulation de la transaction, vous recevrez un Rollback est lié exception (ne me souviens pas qui, encore une fois).
Troisième et, enfin, de répondre à ma question initiale:
Vous avez juste à appeler la getEntity méthode de la OptimisticLockException instance pour obtenir l'origine de la gestion des versions d'erreur. Que va vous apporter tout ce que vous besoin pour que.
Merci à tous ceux qui sont passés par ici.
Toutes les questions à ce propos, il suffit de demander et je serai heureux de vous aider.
OriginalL'auteur Marcus