web-dev-qa-db-fra.com

Où mettre @Transactional? Dans la spécification d'interface ou la mise en œuvre?

Ce qui est considéré comme la meilleure pratique dans la mise en place de la @Transactional Annotation? Devrais-je annoter la méthode d'interface ou la mise en œuvre?

52
John Manak

Bonne question. Je l'ai toujours mis dans la mise en œuvre. Peut-être parce que c'est un détail de mise en œuvre plutôt qu'une abstraction.

Vous voudrez peut-être que différentes implémentations ont des comportements transactionnels différents.

El Guapo a noté que, en plus de cela, il y a plus de problèmes pouvant résulter de la mise sur l'interface, liée à la stratégie de proxyage.

32
Bozho

Cela dépend vraiment de votre architecture d'application, à mon avis. Cela dépend de la façon dont vous êtes en train de proxyer vos cours. Si votre application est définie sur proxy-target-class='true' (Dans votre contexte de candidature, alors votre @Transactional Les informations ne seront pas ramassées si vous annotez l'interface.

Vérifiez les Documents de printemps - "Tips" pour plus d'informations.

Le printemps vous recommande d'annoter des classes concrètes (et des méthodes de classes en béton) avec l'annotation @TransAdratage, par opposition aux interfaces d'annotation. Vous pouvez certainement placer l'annotation @TransActional sur une interface (ou une méthode d'interface), mais cela ne fonctionne que comme vous l'attendez si vous utilisez des proxies basées sur des interfaces. Le fait que Java annotations ne soit pas hérité des interfaces signifie que si vous utilisez des procurations basées sur classe (proxy-cible-class = "vrai") ou l'aspect basé sur le tissage (mode = " AspectJ "), alors les paramètres de transaction ne sont pas reconnus par l'infrastructure de proxytement et de tissage, et l'objet ne sera pas emballé dans un proxy transactionnel, qui serait résolument mauvais.

44
El Guapo

Bien que la gestion des transactions soit une mise en œuvre de la mise en œuvre dans de nombreux cas, il s'agit également d'un détail d'interface. Par exemple, lors de la définition d'une interface des services de votre application, vous pourriez envisager de mettre @Transactional Dans la définition d'interface pour clarifier spécifiquement la stratégie de propagation que vous utilisez.

1
oiavorskyi

Je n'utilise pas d'interfaces sur mon système car jusqu'à présent, je ne vois pas vraiment s'il sera possible de mettre en œuvre quoi que ce soit. J'ai donc mis des annotations sur la mise en œuvre et je crois que le printemps rendrait tout ce qui est correct pour moi.

Je ne pense pas que toutes les classes doivent avoir des interfaces. Je vois autour de nombreuses architectures avec beaucoup de motifs et ils aiment toutes les interfaces. Mais une question: si vous mettez l'annotation de printemps dans l'interface et vous, pour une raison quelconque, vous souhaitez une autre approche à la transaction d'une classe de mise en œuvre effectuée sur cette interface, vous ne pouviez pas faire cela. Ou ai-je tort?

À votre santé.

0