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/