sql >> Base de Datos >  >> RDS >> Mysql

LazyInitializationException tratando de obtener una instancia inicializada perezosa

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/