2010-10-08 19 views
53

En primer lugar, es posible que esté preguntando algo que se haya preguntado y respondido anteriormente, pero no pude obtener un resultado de búsqueda. Muy bien en general (o siempre hasta el momento :)) Definimos anotaciones transaccionales en la capa de servicio. El patrón típico de hibernación de primavera es generalmenteDónde debe colocarse "@Transactional" Service Layer o DAO

Controlador-> Administrador-> Dao-> Orm.

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

Qué capa debo reemplazar. Creo que tiene que ser Dao, que me proporcionará datos del servicio web y lo enviará de regreso. 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 hermético (si existe algo así como no tener un acoplamiento flojo) cuando colocamos @Transactional en la capa de Servicio. Tantos cerebros no pueden estar equivocados o lo son (lo dudo).

Así que la pregunta es "¿Dónde debería estar" @Transactional "debe colocar Service Layer o DAO?" y es la capa de servicio hacia abajo que debería reemplazar.

+6

Esta pregunta es en realidad un duplicado de [Spring @Transactional Annotation Best Practice] (http://stackoverflow.com/questions/1079114/spring-transactional-annotation-best-practice). –

Respuesta

34

Idealmente, la Capa de servicio (Administrador) representa la lógica de su negocio y, por lo tanto, debe ser anotada con @Transactional.

La capa de servicio puede llamar a diferentes DAO para realizar operaciones de base de datos. Supongamos situaciones en las que tiene 3 operaciones DAO en un método de servicio. Si su primera operación DAO falló, otros dos pueden aún pasar y usted terminará en un estado incoherente de DB. La capa de servicio de anotación puede salvarlo de tales situaciones.

+0

Gracias por su respuesta. ¿Puedes indicar el año en que respondiste? Lo creas o no, creo que podrías haber probado la existencia de la máquina del tiempo. Te di +1 en 2015. – Shahzeb

+0

No me di cuenta del año hasta que me lo preguntaste :) – Badal

51

Querrá que sus servicios sean transaccionales. Si sus DAO son transaccionales y llama a diferentes DAO en cada servicio, entonces tendría múltiples tx, que no es lo que desea. Realice las llamadas de servicio transaccionales, y todas las llamadas DAO dentro de esos métodos participarán en el tx para el método.

+6

no pudo especificar un método de propagación en su anotación '@ Transaction', por lo que solo se usa 1 transacción, ya que está en la lista [aquí] (http://static.springsource.org/spring/docs/3.0.x /spring-framework-reference/html/transaction.html#tx-propagation) –

+0

@FotisParaskevopoulos Eso funcionaría solo si tiene '@ Transactional' * tanto * el servicio * como * el DAO. Entonces la anotación adicional no dolerá, pero tampoco ayudará. –

3

sugiero 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. refer

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

El servicio es el mejor lugar para poner @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 comercial.

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

Así que, en la práctica, puede colocarlos en cualquier lugar, depende de usted.

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

0

Es una elección personal basada en tipos de aplicaciones, si la aplicación está distribuida en muchos módulos y la mayoría de las operaciones están basadas en @CRUD, entonces tener anotación transaccional en el nivel de servicio hace más sentido ... aplicación de tipo de motor como programadores, trabajo servidores, @ etl, aplicaciones de informes, donde las sesiones y el concepto de usuario no existen, entonces la transacción de propagación a nivel de contexto es la más adecuada ... no deberíamos terminar creando transacciones clúster al poner @transactional en todas partes terminando con patrones anti transaccionales ... de todos modos para el control pragmático de la transacción JTA2 es la respuesta más adecuada ... una vez más depende del clima puede usarlo en una situación determinada ...

0

Debe utilizar @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 al proporcionar un servicio diferente o al crear una interfaz e implementar la interfaz en diferentes modelos y con el mismo servicio poblar el modelo basado en el cliente. Esta decisión se basa en los requisitos del negocio y el alcance del proyecto.

Cuestiones relacionadas