For det første bør du forstå, at roden til problemet ikke er en transaktion. Vi har en transaktion og en vedvarende kontekst (session). Med @Transactional annotation Spring skaber en transaktion og åben vedvarende kontekst. Efter metoden er påkaldt bliver en vedvarende kontekst lukket.
Når du kalder en user.getUserAccount() du har en proxy-klasse, der omslutter UserAccount (hvis du ikke indlæser UserAccount med User ). Så når en vedvarende kontekst er lukket, har du en LazyInitializationException under opkald af enhver metode til UserAccount , for eksempel user.getUserAccount().toString() .
@Transactional virker kun på userService niveau, i dit tilfælde. For at få @Transactional arbejde, er det ikke nok at sætte @Transactional anmærkning om en metode. Du skal hente et objekt af en klasse med metoden fra en Spring Context . Så for at opdatere penge kan du bruge en anden servicemetode, for eksempel updateMoney(userId, amount) .
Hvis du vil bruge @Transactional på controller-metoden har du brug for at få en controller fra Spring Context . Og Spring burde forstå, at det skal ombryde hver @Transactional metode med en særlig metode til at åbne og lukke en vedvarende kontekst. En anden måde er at bruge Session Per Request Anti-mønster. Du skal tilføje et særligt HTTP-filter.
https://vladmihalcea.com/the-open-session- in-view-anti-pattern/