Où dois - “@Transactionnelle” être sur la place de la Couche de Service ou DAO
Tout d'abord, il est possible que je demande quelque chose qui a été demandé et répondu avant mais je ne pouvais pas obtenir un résultat de recherche en arrière . Bon en général (ou toujours jusqu'à présent:) ) Nous définissons transactionnelle annotations sur la couche de service typiques spring hibernate crud est généralement
Contrôleur->Manager->Dao->Orm .
J'ai maintenant une situation où j'ai besoin de choisir entre le modèle de domaine basé sur le site du client .
Dire que le client est à l'aide de mon modèle de domaine tout est bon, mais alors un autre site client pourrait me donner un service web et de ne pas être à l'aide de notre modèle de domaine .
La couche sur laquelle devrais-je remplacer . Je crois qu'il a d'être Dao qui sera me procurer des données à partir du service web et en l'envoyant en arrière.j'.e deux séparément écrit Dao couches et branché basé sur le scénario .
J'ai réalisé aujourd'hui que nous avons fait couplage (si il ya une telle chose ou de dire de ne pas avoir le couplage lâche) lorsque nous avons mis @Transactionnelle dans la couche de Service . Donc, de nombreux cerveaux ne peuvent pas être faux ou sont-ils (j'en doute).
Donc, la question est "Où "@Transactionnelle" être sur la place de la Couche de Service ou DAO ?" et est-il de la couche de service vers le bas je doit être remplacé .
- Cette question est en fait un double de Printemps @Transactional Annotation des Meilleures Pratiques.
Vous devez vous connecter pour publier un commentaire.
Idéalement, la couche de Service(Gestionnaire) représente une logique d'entreprise et donc il doit être annotée avec @Transactionnelle.
De la couche de Service peut appeler différents DAO pour effectuer DB opérations. Supposons une situation où vous avez 3 DAO opérations dans un service méthode. Si votre 1er DAO échec de l'opération, deux autres peut-être encore passé et vous allez vous retrouver incompatible DB état. L'annotation de la couche de Service peut vous sauver de ces situations.
Vous allez vouloir vos services transactionnels. Si votre DAOs sont transactionnelles, et vous appel à des DAOs dans chaque service, alors que vous auriez plusieurs txs, ce qui n'est pas ce que vous voulez. Faire les appels de service sur les transactions et tous les DAO des appels à l'intérieur de ces méthodes vont participer à la tx de la méthode.
@Transaction
d'annotation, de sorte que seulement 1 transaction est utilisé, comme il est indiqué ici@Transactional
sur deux service et le DAO. Puis l'annotation supplémentaire ne fera pas de mal, mais ne va pas aider non plus.je vous suggère de mettre @Transactionnelle dans la couche de Service méthodes, car on peut avoir plusieurs DAO implémentations. en utilisant ce que nous pouvons nos services seront à la transaction. reportez-vous
meilleure pratique consiste à utiliser Un générique BasicService d'offrir des services communs.
Le Service est le meilleur endroit pour placer @Transactional, de la couche de service doit contenir le détail au niveau de cas d'utilisation, le comportement de l'interaction d'un utilisateur qui aurait logiquement aller dans une transaction. de cette façon, nous pouvons disposer de maintenir la séparation entre le code de l'application web et la logique métier.
Il y a beaucoup de CRUD applications qui n'ont pas significatif de la logique d'entreprise, pour avoir une couche de service qui transmet simplement les choses entre les contrôleurs et les objets d'accès aux données n'est pas utile. Dans ces cas, nous pouvons mettre opération d'annotation sur Dao.
Donc, dans la pratique, vous pouvez mettre en place, c'est à vous.
Par le fait d'avoir plusieurs appels dans votre service, vous avez besoin d' @Transactional en service. les différents appels de service vont s'exécuter dans les différentes transactions si vous mettez @Transactional en service.
C'est un choix personnel basé sur les types de demande, si la demande est layerd à travers de nombreux modules et la majorité des opérations sont @CRUD base ,puis d'avoir @transactional annotation au niveau du service fait plus de sens.. moteur type d'application, comme les planificateurs , les job servers,@etl rapport d'applications, où les sessions et le concept d'utilisateur n'existe pas, puis propagational de transaction au niveau de contexte est le plus adapté... nous ne devrions pas créer des clusterd transactions en mettant @transactional, en tous lieux, en terminant transactionnelle anti figures...de toute façon pragmatique le contrôle des transactions JTA2 est le plus approprié réponse...encore une fois cela dépend de la météo, vous pouvez l'utiliser dans des situations...
Vous devez utiliser @Transactional à la couche de 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 autre modèle,vous pouvez modifier le modèle de domaine sans impact sur la couche DAO par la fourniture d'un autre service ou par la création d'une interface et de l'implémentation de l'interface dans le modèle différent et le même service d'alimenter le modèle basé sur le client.Cette décision est fondée sur les exigences de l'entreprise et de la portée du projet.