Mise en veille prolongée (JPA): comment gérer StaleObjectStateException lorsque plusieurs objets a été modifié et engagé

StackOverflow https://stackoverflow.com/questions/4838786

Question

Considérez le scénario: A Db transaction il englobe plus d'une rangée de tables différentes avec des versions.

Par exemple: A shopLists et produits. Lorsqu'un Shoplist peut contenir des produits (avec leur montant dans la Shoplist) et les produits ont leur stock actuel.

Quand j'insérer une Shoplist modifier OU, je veux le stock de ces produits dans le Shoplist être mis à jour pour maintenir le stock cohérente.

Pour ce faire, j'ouvrir une transaction, insérer / mettre à jour la Shoplist, mettre à jour les stocks pour chaque produit (appliquer delta) puis valider la transaction. Pas grand-chose jusqu'à maintenant.

Cependant, un autre utilisateur peut avoir mis à jour un ou plusieurs produits en commun. Ou encore mis à jour le Shoplist lui-même. Dans les deux cas, je recevrais un StaleObjectStateException quand commiting la transaction.

La question est: Est-il possible de déterminer quelle table a provoqué la StaleObjectStateException

Dans le cas où le produit a provoqué l'exception, je pouvais rafraîchir tous les produits envolved de la DB et puis appliquez de nouveau les deltas stock. Et c'est très bien. Dans le cas où le Shoplist a provoqué l'exception, il serait préférable de simplement signaler le problème à l'utilisateur afin qu'il puisse recommencer.

Merci beaucoup pour votre aide.

Était-ce utile?

La solution

J'ai trouvé comment.

Premières choses d'abord: l'APP (ou la mise en veille prolongée elle-même) enveloppe l'exception de org.hibernate.StaleObjectStateException comme javax.persistence.OptimisticLockException. Donc, si vous voulez prendre la bonne exception, allez OptimisticLockException.

Deuxième: La mise en veille prolongée ne jeter le OptimisticLockException lorsque vous appelez méthode EntityManager Flush avant de commettre. Si vous appelez directement Engagez vous obtiendrez une autre exception au lieu (je l'ai oublié qui). Considérant presque tout le monde attrape les exceptions émises par la méthode Commit et partez pour une annulation de la transaction, vous obtiendrez une exception dans le cas de Rollback (ne me souviens pas qui encore une fois).

Troisième et en répondant à ma question initiale finaly: Il vous suffit d'appeler la méthode getEntity de l'instance OptimisticLockException pour obtenir l'origine de l'erreur Versioning. Cela va vous fournir tout ce dont vous avez besoin lié à cela.

Merci pour tous ceux qui sont passés par ici. Pour toute question concernant cela, demander et je serai heureux de l'aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top