J'utilise CMT dans les beans de session sans état EJB3. De plus, j'ai créé ma propre exception avec l'annotation "@ApplicationException (rollback = true)".
Dois-je utiliser "context.setRollbackOnly ()" lorsque je veux annuler la transaction?
Puis-je simplement annuler la transaction en lançant une exception dans la méthode publique dans le bean?
Si c'est le cas (la réponse à la question 2 est oui), dois-je supprimer l'exception de la méthode en déclarant l'exception dans la méthode ou sera-t-il suffisant de simplement lever une exception dans la méthode et de la gérer dans la même méthode? lui-même? (Je ne veux pas propager l'exception au niveau suivant. Je veux simplement restaurer l'exception.)
Merci d'avance. ;)
Tout d'abord, il n'y a pas d'annulation d'une exception, c'est une annulation d'une transaction.
@ApplicationException(rollback=true)
, vous n'avez pas à annuler la transaction manuellement. Context.setRollbackOnly()
force le conteneur à annuler la transaction, même s'il n'y a pas d'exception.@ApplicationException(rollback=true)
. Si l'exception est une RuntimeException
et qu'elle n'est pas interceptée, le conteneur est tenu d'annuler la transaction. Mais attention, dans ce cas, le conteneur éliminera l'instance EJB.RuntimeException
, la transaction sera automatiquement annulée. Si vous attrapez une exception cochée dans le code, vous devez utiliser setRollbackOnly
pour annuler la transaction.Pour plus d'informations, consultez le livre gratuit Mastering EJB . Il décrit très bien les scénarios de restauration et est gratuit pour download .
La question de savoir comment empêcher les exceptions vérifiées annotalement déclarées de provoquer une annulation lors du lancement de la propagation vers la "couche supérieure" n'est pas encore résolue ici.
Je pense que cela nécessitera un wrapper autour de l'EJB en question qui avalera l'exception levée. (En d'autres termes: je pense que l'exception personnalisée DOIT être émise contre la limite de la méthode (et donc non capturée et traitée à l'intérieur de la méthode) ET propagée pour prendre effet transactionnel - et entraînera à son tour la destruction de l'instance EJB.)