2012-01-24 18 views
8

Estoy utilizando Spring MVC con Hibernatedaosupport para mis clases DAO. ¿Confundido aquí dónde comenzar la transacción, ya sea en la capa de servicio o en la capa DAO?¿Cuál es la forma correcta de utilizar Spring MVC con Hibernate en DAO, arquitectura de capa de servicio

Mi vista interactúa con la capa de Servicio. Los DAO se inyectan en los servicios.

¿Cuál es la forma correcta de utilizar Spring MVC con Hibernate en DAO, arquitectura de capa de servicio?

+0

u puede explicar claramente ... –

+0

@JustinThomas Eso es como útiles, pero diferente. –

Respuesta

20

En mi humilde opinión las transacciones deben ir a la capa de servicio. Normalmente, una transacción comercial consiste en varias consultas y actualizaciones. Si coloca @Transactional solo en la capa DAO, cada consulta y actualización se ejecutará en una transacción separada, lo que de hecho frustra el propósito de las transacciones.

Pero si los servicios son @Transactional, cada interacción de base de datos se une a una transacción principal iniciada cuando la capa web entró en la capa de servicio. Tenga en cuenta que en este caso si la capa web ejecuta varios métodos de servicio, cada uno de ellos se ejecutará en una transacción separada (el mismo problema se desplazó un nivel). Pero colocar @Transactional en la capa web podría introducir efectos secundarios inesperados como el problema N + 1, que de otro modo se hubiera detectado. Por lo tanto, trate de mantener una transacción comercial en un método de servicio llamado desde la capa web.

+0

grr me ganaron ... + 1 – hvgotcodes

+0

¡De la misma manera, dagnabbit! –

+0

Tomasz siempre me gana ... +1 – aweigold

0

Obviamente capa DAO. Todo lo que se conecta a la capa de acceso a datos debe estar en la capa DAO y (preferiblemente) anotado con @Repository y su servicio (anotado con @Service) debe tener un identificador para la instancia DAO.

Un servicio puede llamar a varios DAO pero no al revés. Los DAO deben ser de naturaleza atómica.

Si está iniciando una transacción, entonces debe estar en la capa de servicio, en mi opinión, lo que respalda mi afirmación anterior donde menciono que los DAO deben ser de naturaleza atómica.

+0

pero si comienzo la transacción en la capa DAO, estoy recibiendo dos sesiones abiertas excepción o ninguna sesión enlazada ... becoz en la capa de servicio si llamo a dos métodos esos dos métodos están usando sesiones diferentes derecho ... entonces cómo resolver esto .. –

+1

¿Por qué? Eso requeriría transacciones anidadas para cualquier cosa que pase por más de un DAO. –

+0

ghostrider negativo, @tomasz la respuesta es correcta ... – hvgotcodes

Cuestiones relacionadas