Où “@Transactional” doit-il être placé Couche de service ou DAO

Tout d’abord, il est possible que je demande quelque chose qui a été demandé et répondu auparavant, mais je n’ai pas pu obtenir un résultat de recherche. Okay généralement (ou toujours si loin :)) Nous définissons les annotations transactionnelles sur la couche de service hibernate typique de spring crud est généralement

Contrôleur-> Gestionnaire-> Dao-> Orm.

Je dois maintenant choisir entre le modèle de domaine basé sur le site du client. Supposons que le client A utilise mon modèle de domaine tout est bien, mais un autre site client me donnerait un service Web sans utiliser notre modèle de domaine.

Quelle couche dois-je remplacer? Je pense que Dao devra me faire parvenir les données du service Web et les renvoyer à deux couches Dao écrites séparément, et les twigr en fonction du scénario.

Je me suis maintenant rendu compte que nous faisions un couplage serré (s’il y a une telle chose ou que nous disons ne pas avoir de couplage lâche) lorsque nous plaçons @Transactional dans la couche Service. Tant de cerveaux ne peuvent pas avoir tort ou sont-ils (j’en doute).

Donc, la question est “Où” @Transactional “devrait-il être placé dans la couche Service ou DAO?” et est-ce que je devrais remplacer la couche de service vers le bas.

    Idéalement, la couche de service (gestionnaire) représente votre logique métier et doit donc être annotée avec @Transactional.

    La couche de service peut appeler différents DAO pour effectuer des opérations de firebase database. Supposons une situation où vous avez 3 opérations DAO dans une méthode de service. Si votre première opération DAO a échoué, deux autres peuvent encore être passées et vous allez vous retrouver dans un état de base incohérent. Annoter la couche de service peut vous sauver de telles situations.

    Vous allez vouloir que vos services soient transactionnels. Si vos DAO sont transactionnels et que vous appelez différents DAO dans chaque service, vous aurez alors plusieurs Tx, ce qui n’est pas ce que vous voulez. Faites en sorte que le service appelle les transactions, et tous les appels DAO dans ces méthodes participeront à la transaction tx pour la méthode.

    Je suggère de mettre @Transactional dans les méthodes de couche Service car nous pouvons avoir plusieurs implémentations DAO. En utilisant cela, nous pouvons faire en sorte que nos services soient transactionnels. référer

    La meilleure pratique consiste à utiliser un BasicService générique pour offrir des services communs.

    Le service est le meilleur endroit pour placer @Transactional, la couche de service doit contenir le comportement de cas d’utilisation de niveau de détail pour une interaction d’utilisateur qui irait logiquement dans une transaction. De cette manière, nous pouvons maintenir une séparation entre le code de l’application Web et la logique métier.

    Il y a beaucoup d’applications CRUD qui n’ont pas de logique métier significative, car il n’est pas utile pour elles d’avoir une couche de service qui ne fait que transmettre des données entre les contrôleurs et les objects d’access aux données. Dans ces cas, nous pouvons mettre une annotation de transaction sur Dao.

    Donc, dans la pratique, vous pouvez les placer à chaque endroit, à vous de voir.

    En ayant plusieurs appels dans votre service, vous avez besoin de @Transactional en service. différents appels au service s’exécuteront dans différentes transactions si vous mettez en service @Transactional.

    C’est un choix personnel basé sur les types d’applications, si l’application est créée sur plusieurs modules et que la majorité des opérations sont basées sur @CRUD, alors avoir une annotation @transactional au niveau du service rend plus sage .. application de type de moteur les applications de rapport, où les sessions et le concept d’utilisateur n’existent pas, alors la transaction de propagation au niveau du contexte convient le mieux … nous ne devrions pas finir par créer des transactions clusterd en mettant @transactional à la fin le contrôle JTA2 est la réponse la plus adaptée … encore une fois cela dépend de la météo, vous pouvez l’utiliser dans des situations données …

    Vous devez utiliser @Transactional à la couche service, si vous souhaitez modifier le modèle de domaine pour le client B où vous devez fournir les mêmes données dans un modèle différent, vous pouvez modifier le modèle de domaine sans affecter la couche DAO en fournissant un service différent ou en créant une interface et en implémentant l’interface dans différents modèles et avec le même service, remplissez le modèle en fonction du client. Cette décision est basée sur le besoin métier et la scope du projet.