Pourquoi utiliser @Transactionnel avec @Service à la place de @Contrôleur

J'ai vu de nombreux commentaires dans la pile de débordement articles que j'ai trouvé certaines choses à propos @Transactional utiliser avec @Service ou avec @Contrôleur

"D'habitude, on devrait mettre une transaction à la couche de service."

"Normal, ce serait le cas pour annoter sur une couche de service de niveau"

"Penser les transactions appartiennent à la couche de Service. C'est celui qui sait à propos des unités de travail et des cas d'utilisation. C'est la bonne réponse, si vous avez plusieurs DAOs injecté dans un Service qui doivent travailler ensemble en une seule transaction." [Source]

Inconvénient à utiliser @transactionnel avec @couche de service

Si j'avais 2 méthodes pour exemple saveUser() et saveEmail() (parce que je stocker les e-mails dans une base de données pour les envoyer plus tard - comme une file d'attente) je voudrais créer dans mon service une méthode saveUserAndSendEmail(Utilisateur), qui serait à la transaction. [Source]

Cela signifie que j'ai créer de nombreuses méthodes de la couche de service au lieu d'une seule Enregistrer Méthode Générique comme suit

public <T> long save(T entity) throws DataAccessException {
    Session session = sessionFactory.getCurrentSession();
    long getGenVal=(Long) session.save(entity);
    return getGenVal;
}

Selon la solution ci-dessus , cela signifie que nous avons beaucoup de méthodes comme la suite LOL..

public <T> long saveAccount(T entity)....

public <T> long saveWithAuditLog(T entity, K entity1)....

public <T> long saveWithAuditLogAndEntries(T entity, K entity, M entity)....

De SURMONTER cette situation,

Je UTILISER LE @Transactionnelle @Contrôleur et faire un Générique de la Méthode Enregistrer et de sauvegarder toutes les entités/modèle à l'aide de cette simple méthode de sauvegarde. et si une méthode ne parviennent pas à enregistrer, puis sur toutes les transactions dans le contrôleur de la restauration avec succès.

Autre situation que vous assurer que @Transactionnelle doit être utiliser avec @Contrôleur

Dans @Controller:

pt.save(entity1);
pt.save(entity2);
int a = 2/0;
pt.save(entity3);

Dans le cas où , @Transactional sur le Service, les 2 premiers entité enregistrée avec succès mais le troisième, non pas la restauration de toutes les transactions

Dans le cas où , @Transactional sur @Contrôleur toute l'annulation de la transaction que l'exception se produire

pourquoi stack overflow a demandé , "ne pas faire de transactions dans votre contrôleur. Les mettre dans votre couche de service des classes."?
[source]

S'il vous plaît ne pas utiliser le code de balisage de texte. Vous pouvez utiliser le bloc des guillemets pour les citations si vous le souhaitez.
Je pense que la meilleure solution dans le cas est de créer un autre niveau de la couche entre la controller et la service. Comme je vois de la controller ne gère que les appels et les préparer vars à manipuler et à faire de la logique. Le service gérer tous les DB choses. et le modèle de ce qui devrait être entre les controller et la service pouvez faire un peu de logique. Dans votre exemple faire quelques enregistre les actions, c'est une logique des actions sur les données . ce qui signifie mettre en model et de fausser model avec transactional si nécessaire
Votre saveUser() et saveEmail() méthodes devraient être dans la couche DAO. Alors vous vous faire saveUserAndSendEmail(User user) méthode dans la couche de Service transactionnel.

OriginalL'auteur Shahid Ghafoor | 2013-08-28