Je suis en train d'expérimenter l'utilisation du modèle de conception de commande pour permettre à ma couche web de fonctionner avec des entités Hibernate dans le contexte d'une seule transaction (évitant ainsi les exceptions de chargement paresseux). Cependant, je suis maintenant confus sur la manière dont je devrais gérer les transactions.
Mes commandes appellent des méthodes de la couche de service qui sont annotées avec @Transactional
. Certaines de ces méthodes de la couche de service sont en lecture seule - par exemple, @Transactional(readOnly = true)
- et d'autres sont en lecture/écriture.
Ma couche de service expose un gestionnaire de commandes qui exécute les commandes qui lui sont passées au nom de la couche web.
@Transactional
public Command handle(Command cmd) throws CommandException
Je suppose que j'ai raison de rendre la méthode handle
du gestionnaire de commandes transactionnelle. C'est là que la confusion intervient. Si l'implémentation d'une commande appelle plusieurs méthodes de la couche de service, il n'y a aucun moyen pour le gestionnaire de commandes de savoir si les opérations appelées dans la commande seront en lecture seule, en lecture/écriture ou une combinaison des deux.
Je ne comprends pas comment la propagation fonctionne dans cet exemple. Si je devais rendre la méthode handle()
readOnly = true
, que se passe-t-il si la commande appelle ensuite une méthode de la couche de service qui est annotée avec @Transactional(realOnly = false)
?