sql >> Database teknologi >  >> RDS >> Mysql

LazyInitializationException forsøger at få doven initialiseret instans

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/



  1. PHP Fatal fejl:Kald til udefineret funktion mssql_connect()

  2. MySQL INDSÆT I ... VÆRDIER og VÆLG

  3. Uploader stor mysql-database på AWS RDS ved hjælp af kit - 'MySQL-serveren er gået væk'

  4. Vælg mellem agentbaseret og agentløs overvågning