¿Por qué no usar el OpenEntityManagerInViewFilter de Spring?
Si bien se han escrito muchas publicaciones sobre el tema OpenSession / EntityManagerInViewFilter de Spring, no pude encontrar ninguna que mencione sus defectos. Por lo que entiendo, y asumiendo una arquitectura de aplicación web en capas típica utilizando una capa de servicio @Transactional, el filtro funciona de la siguiente manera:
El filtro intercepta una solicitud de servlet.El filtro abre un EntityManager y lo enlaza con el hilo actualControlador web se llamaControlador web de llamadas a servicio.El interceptor de transacciones comienza una nueva transacción, recupera el EntityManager enlazado a subprocesos y lo enlaza con la transacciónSe llama al servicio, hace algunas cosas con EntityManager, luego devuelveEl interceptor de transacciones vacía el EntityManager y luego realiza la transacciónEl controlador web prepara la vista, luego regresaSe construye la vistaEl filtro cierra el EntityManager y lo desvincula del hilo actualEn los pasos 8 y 9, los objetos que se cargaron con el EntityManager del subproceso todavía se administran. En consecuencia, si se tocan asociaciones perezosas en estos pasos, se cargarán desde la base de datos utilizando el EntityManager aún abierto. Por lo que entiendo, cada acceso requerirá que la base de datos abra una transacción. La administración de transacciones de Spring no estará al tanto de esto, por lo tanto, lo llamo "transacción implícita".
Veo 2 problemas con esto:
Cargar varias asociaciones perezosas resultará en múltiples transacciones de base de datos, un posible impacto en el rendimientoEl objeto raíz y sus asociaciones perezosas se cargan en diferentes transacciones de base de datos, por lo que los datos posiblemente estén obsoletos (por ejemplo, la raíz cargada por el subproceso 1, las asociaciones raíz actualizadas por el subproceso 2, las asociaciones raíz cargadas por el subproceso 1)Por un lado, estos 2 problemas parecen suficientes para rechazar el uso de este filtro (impacto de rendimiento, inconsistencia de datos). Por otro lado, esta solución es muy conveniente, evita escribir varias líneas de código, el problema 1 puede no ser tan perceptible y el problema 2 puede ser paranoia pura.
¿Qué piensas?
¡Gracias!