¿Dónde poner @Transaccional? En especificación de interfaz o implementación?


¿Cuál se considera la mejor práctica para colocar la anotación @Transactional? ¿Debo anotar el método de interfaz o la implementación?

Author: naXa, 2011-04-05

4 answers

Buena pregunta. Siempre lo he puesto en la implementación. Tal vez porque es un detalle de implementación, en lugar de una abstracción.

Es posible que desee que diferentes implementaciones tengan diferentes comportamientos transaccionales.

El Guapo señaló que, además de eso, hay más problemas que pueden surgir al poner en la interfaz, relacionados con la estrategia de proxy.

 28
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-05 12:12:36

Realmente todo depende de la arquitectura de su aplicación, en mi opinión. Depende de cómo estés proxy en tus clases. Si tiene su aplicación configurada en proxy-target-class='true' (en el contexto de su aplicación, entonces su información @Transactional no se recogerá si anota la interfaz.

Echa un vistazo a Los documentos de Primavera {"Consejos" para obtener más información.

Spring recomienda que solo anote clases de concreto (y métodos de clases de concreto) con la anotación @ Transaccional, como se opone a la anotación de interfaces. Ciertamente puede colocar la anotación @ Transaccional en una interfaz (o un método de interfaz), pero esto funciona solo como esperaría si está utilizando proxies basados en interfaz. El hecho de que las anotaciones Java no se hereden de las interfaces significa que si está utilizando proxies basados en clases (proxy-target-class="true") o el aspecto basado en weaving (mode="aspectj"), entonces la configuración de la transacción no es reconocida por la infraestructura de proxy y weaving, y el objeto no estará envuelto en un proxy transaccional, lo que sería decididamente malo.

 40
Author: El Guapo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-09 14:54:40

Si bien la gestión de transacciones es un detalle de implementación en muchos casos, a menudo también es un detalle de la interfaz. Por ejemplo, al definir la interfaz de servicios de su aplicación, podría considerar poner @Transactional en la definición de la interfaz para aclarar específicamente qué estrategia de propagación está utilizando.

 1
Author: Oleg Iavorskyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-05 12:16:40

No uso interfaces en mi sistema porque hasta ahora realmente no veo si será posible implementar algo sobre él. Así que puse anotaciones en la implementación y creo que la primavera haría todo correcto para mí.

No creo que todas las clases deban tener interfaces. Veo muchas arquitecturas con muchos patrones y a todos les encantan las interfaces. Pero una pregunta: si pones la anotación de primavera en la interfaz y, por alguna razón, quieres otra acercamiento a la transacción de una clase de implementación realizada a través de esta interfaz, no podría hacer eso. ¿O me equivoco?

Salud.
 0
Author: Luiz Feijão Veronesi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-30 16:04:16