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/