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/