En primer lugar, debe comprender que la raíz del problema no es una transacción. Tenemos una transacción y un contexto persistente (sesión). Con @Transactional
anotación Spring crea una transacción y abre un contexto persistente. Después de invocar el método, se cierra un contexto persistente.
Cuando llamas a un user.getUserAccount()
tiene una clase de proxy que envuelve UserAccount
(si no carga UserAccount
con User
). Entonces, cuando se cierra un contexto persistente, tiene una LazyInitializationException
durante la llamada de cualquier método de UserAccount
, por ejemplo, user.getUserAccount().toString()
.
@Transactional
trabajando solo en el userService
nivel, en su caso. Para obtener @Transactional
trabajo, no es suficiente poner el @Transactional
anotación en un método. Necesita obtener un objeto de una clase con el método de un Spring Context
. Entonces, para actualizar el dinero, puede usar otro método de servicio, por ejemplo, updateMoney(userId, amount)
.
Si desea utilizar @Transactional
en el método del controlador, necesita obtener un controlador del Spring Context
. Y Spring debería entender que debería envolver cada @Transactional
método con un método especial para abrir y cerrar un contexto persistente. Otra forma es usar el patrón Anti sesión por solicitud. Deberá agregar un filtro HTTP especial.
https://vladmihalcea.com/the-open-session- a la vista-anti-patrón/