web-dev-qa-db-fra.com

Où devrait-on placer "@Transactional" dans la couche de service ou DAO?

Premièrement, il est possible que je demande quelque chose qui a déjà été demandé mais que je n'ai pas pu obtenir de résultat de recherche. D'accord en général (ou toujours jusqu'à présent :)) Nous définissons des annotations transactionnelles sur la couche de services

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

J'ai maintenant une situation où je dois choisir entre le modèle de domaine basé sur le site client. Supposons que le client A utilise mon modèle de domaine, tout va bien, mais un autre site client me fournirait un service Web sans utiliser notre modèle de domaine.

Quelle couche devrais-je remplacer? Je crois que ce doit être Dao qui va me chercher les données du service Web et les renvoyer.i.e deux couches de Dao écrites séparément et connectées selon le scénario.

Je viens de me rendre compte que nous faisons un couplage étroit (s'il existe une telle chose ou si nous disons ne pas avoir de couplage lâche) lorsque nous mettons @Transactional dans la couche Service. Tant de cerveaux ne peuvent pas se tromper ou sont-ils (j'en doute). 

La question est donc "Où" @Transactional "devrait-il être placé dans la couche de service ou DAO?" et est-ce la couche de service vers le bas que je devrais remplacer?.

67
Shahzeb

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

La couche service peut appeler différents DAO pour effectuer des opérations de base de données. Supposons une situation dans laquelle vous avez 3 opérations DAO dans une méthode de service. Si votre première opération DAO a échoué, il se peut que deux autres soient toujours transmis et vous obtiendrez un état de base de données incohérent. L'annotation de la couche Service peut vous éviter de telles situations.

53
Badal

Vous allez vouloir que vos services soient transactionnels. Si vos DAO sont transactionnelles et que vous appelez différentes DAO dans chaque service, vous disposez alors de plusieurs tx, ce qui n'est pas ce que vous voulez. Transformez les appels de service en transaction et tous les appels DAO au sein de ces méthodes participeront à la transmission pour la méthode.

54
hvgotcodes

je suggérerai de mettre @Transactional dans les méthodes de la 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 mettre @Transactional. La couche service doit contenir le comportement de cas d'utilisation au niveau de détail pour une interaction utilisateur qui irait logiquement dans une transaction. De cette manière, nous pouvons maintenir une séparation entre le code d'application Web et la logique métier.

De nombreuses applications CRUD n'ont pas de logique métier significative. Il est inutile de disposer d'une couche de service qui ne fait que transmettre des éléments entre les contrôleurs et les objets d'accès aux données. Dans ces cas, nous pouvons mettre une annotation de transaction sur Dao.

Donc, dans la pratique, vous pouvez les placer à n'importe quel endroit, à vous de choisir.

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

4
kapil das

Vous devez utiliser @Transactional au niveau de la couche de service. Si vous souhaitez modifier le modèle de domaine du client B, vous devez fournir les mêmes données dans un modèle différent. en créant une interface et en implémentant l'interface dans un modèle différent et avec le même service, remplissez le modèle en fonction du client.

0
Sonia Jain

Il s’agit d’un choix personnel basé sur les types d’application, si l’application est étendue sur de nombreux modules et que la majorité des opérations sont basées sur @CRUD, puis avoir une annotation transactionnelle au niveau service rend plus évident. Application de type moteur applications de rapport, où les sessions et le concept d'utilisateur n'existent pas, les transactions de propagation au niveau du contexte conviennent mieux ... nous ne devrions pas créer de transactions clusterd en mettant @transactional partout où nous aboutissons à des anti-patters transactionnels ... de toute façon pour une transaction pragmatique control JTA2 est la réponse la plus appropriée ... encore une fois, cela dépend de la météo, vous pouvez l'utiliser dans des situations données ...

0
David Hamas