Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

LazyInitializationException tentando obter instância inicializada preguiçosa


Em primeiro lugar, você deve entender que a raiz do problema não é uma transação. Temos uma transação e um contexto persistente (sessão). Com @Transactional anotação Spring cria uma transação e abre um contexto persistente. Depois que o método é invocado, um contexto persistente é fechado.

Quando você chama um user.getUserAccount() você tem uma classe proxy que envolve UserAccount (se você não carregar UserAccount com User ). Então, quando um contexto persistente é fechado, você tem um LazyInitializationException durante a chamada de qualquer método de UserAccount , por exemplo user.getUserAccount().toString() .

@Transactional trabalhando apenas no userService nível, no seu caso. Para obter @Transactional funcionar, não basta colocar o @Transactional anotação em um método. Você precisa obter um objeto de uma classe com o método de um Spring Context . Portanto, para atualizar o dinheiro, você pode usar outro método de serviço, por exemplo, updateMoney(userId, amount) .

Se você quiser usar @Transactional no método do controlador, você precisa obter um controlador do Spring Context . E o Spring deve entender que deve envolver cada @Transactional método com um método especial para abrir e fechar um contexto persistente. Outra maneira é usar o padrão Session Per Request Anti. Você precisará adicionar um filtro HTTP especial.

https://vladmihalcea.com/the-open-session- in-view-anti-pattern/