¿Dónde debería colocarse "@Transactional" Capa de servicio o DAO?

81

En primer lugar, es posible que esté preguntando algo que se ha preguntado y respondido antes, pero no pude obtener un resultado de búsqueda. Está bien, en general (o siempre hasta ahora :)) Definimos anotaciones transaccionales en la capa de servicio, la basura típica de hibernación de primavera suele ser

Controlador-> Administrador-> Dao-> Orm.

Ahora tengo una situación en la que necesito elegir entre el modelo de dominio basado en el sitio del cliente. Digamos que el cliente A está usando mi modelo de dominio, todo está bien, pero otro sitio de cliente me daría un servicio web y no estaría usando nuestro modelo de dominio.

¿Qué capa debería reemplazar? Creo que tiene que ser DAO el que me obtendrá los datos del servicio web y los enviará de vuelta, es decir, dos capas DAO escritas por separado y conectadas según el escenario.

Ahora me he dado cuenta de que hemos estado haciendo un acoplamiento estrecho (si existe tal cosa o digamos que no hay acoplamiento suelto) cuando colocamos la @Transactionalcapa de servicio. Tantos cerebros no pueden estar equivocados o lo están (lo dudo).

Entonces la pregunta es "¿Dónde debería" @Transactional"colocarse la capa de servicio o DAO?" y es la capa de servicio hacia abajo la que debería reemplazar.

Shahzeb
fuente
6
Esta pregunta es en realidad un duplicado de Spring @Transactional Annotation Best Practice .
Pascal Thivent

Respuestas:

80

Idealmente, la capa de servicio ( Administrador ) representa su lógica empresarial y, por lo tanto, debe anotarse @Transactional.

La capa de servicio puede llamar a diferentes DAO para realizar operaciones de base de datos. Supongamos una situación en la que tiene 3 operaciones DAO en un método de servicio. Si su primera operación DAO falló, es posible que se pasen otras dos y terminará con un estado de base de datos inconsistente. Anotar la capa de servicio puede salvarlo de tales situaciones.

Badal
fuente
Gracias por su respuesta. ¿Puede indicar el año en que respondió? Lo crea o no, creo que podría haber probado la existencia de la máquina del tiempo. Te di +1 en 2015.
Shahzeb
No me di cuenta del año hasta que preguntaste :)
Badal
60

Vas a querer que tus servicios sean transaccionales. Si sus DAO son transaccionales y llama a diferentes DAO en cada servicio, entonces tendría varias transacciones, que no es lo que desea. Haga que las llamadas de servicio sean transaccionales, y todas las llamadas DAO dentro de esos métodos participarán en las transacciones del método.

hvgotcodes
fuente
6
¿No podría especificar un método de propagación en su @Transactionanotación, de modo que solo se use 1 transacción, como se enumera aquí?
Fotis Paraskevopoulos
1
@FotisParaskevopoulos Eso funcionaría sólo si tiene @Transactionalen tanto el servicio y la DAO. Entonces, la anotación adicional no hará daño, pero tampoco ayudará.
William F. Jameson
6

Sugeriré poner @Transactional en los métodos de la capa de servicio, ya que podemos tener múltiples implementaciones de DAO. Al usar esto, podemos hacer que nuestros servicios sean transaccionales. referir

La mejor práctica es utilizar un BasicService genérico para ofrecer servicios comunes.

El Servicio es el mejor lugar para colocar @Transactional, la capa de servicio debe contener el comportamiento del caso de uso de nivel de detalle para una interacción del usuario que lógicamente iría en una transacción. de esta forma podemos mantener la separación entre el código de la aplicación web y la lógica empresarial.

Hay muchas aplicaciones CRUD que no tienen ninguna lógica comercial significativa, ya que tener una capa de servicio que simplemente pasa cosas entre los controladores y los objetos de acceso a datos no es útil. En estos casos, podemos poner anotaciones de transacciones en Dao.

Entonces, en la práctica, puede colocarlos en cualquier lugar, depende de usted.

Al tener varias llamadas en su servicio, necesita @Transactional en servicio. diferentes llamadas al servicio se ejecutarán en diferentes transacciones si pone @Transactional en servicio.

kapil das
fuente
0

Es una elección personal basada en los tipos de aplicaciones, si la aplicación está dividida en capas en muchos módulos y la mayoría de las operaciones están basadas en @CRUD, entonces tener una anotación @transactional a nivel de servicio tiene más sentido ... aplicación de tipo de motor como programadores, servidores de trabajos, @ etl reportar aplicaciones, donde las sesiones y el concepto de usuario no existe, entonces la transacción propagacional a nivel de contexto es la más adecuada ... no deberíamos terminar creando transacciones agrupadas poniendo @transactional en todas partes terminando anti patrones transaccionales ... de todos modos para transacciones pragmáticas control JTA2 es la respuesta más adecuada ... nuevamente, depende del clima, puede usarlo en situaciones determinadas ...

David Hamas
fuente
0

Debe usar @Transactional en la capa de servicio, si desea cambiar el modelo de dominio para el cliente B donde debe proporcionar los mismos datos en un modelo diferente, puede cambiar el modelo de dominio sin afectar la capa DAO proporcionando un servicio diferente o mediante la creación de una interfaz y la implementación de la interfaz en modelo diferente y con el mismo servicio poblar el modelo en función del cliente. Esta decisión se basa en el requisito de negocio y el alcance del proyecto.

Sonia Jain
fuente