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/