Po pierwsze, powinieneś zrozumieć, że źródłem problemu nie jest transakcja. Mamy transakcję i trwały kontekst (sesję). Z @Transactional adnotacja Spring tworzy transakcję i otwiera trwały kontekst. Po wywołaniu metody trwały kontekst zostaje zamknięty.
Kiedy wywołujesz user.getUserAccount() masz klasę proxy, która otacza UserAccount (jeśli nie wczytasz UserAccount z User ). Więc kiedy trwały kontekst jest zamknięty, masz LazyInitializationException podczas wywołania dowolnej metody UserAccount , na przykład user.getUserAccount().toString() .
@Transactional działa tylko na userService w twoim przypadku. Aby uzyskać @Transactional pracy, nie wystarczy wstawić @Transactional adnotacja do metody. Musisz pobrać obiekt klasy z metodą z Spring Context . Aby zaktualizować pieniądze, możesz użyć innej metody usługi, na przykład updateMoney(userId, amount) .
Jeśli chcesz użyć @Transactional w metodzie kontrolera musisz pobrać kontroler z Spring Context . A Spring powinien zrozumieć, że powinien zawijać każdy @Transactional metoda ze specjalną metodą otwierania i zamykania trwałego kontekstu. Innym sposobem jest użycie wzorca Anti Session Per Request. Musisz dodać specjalny filtr HTTP.
https://vladmihalcea.com/the-open-session- anty-wzorzec-w-widoku/