Ten eerste moet u begrijpen dat de wortel van het probleem niet een transactie is. We hebben een transactie en een persistente context (sessie). Met @Transactional
annotatie Spring creëert een transactie en opent een blijvende context. Nadat de methode is aangeroepen, wordt een persistente context gesloten.
Wanneer u een user.getUserAccount()
. aanroept je hebt een proxyklasse die UserAccount
omhult (als u UserAccount
niet laadt met User
). Dus wanneer een persistente context wordt gesloten, heb je een LazyInitializationException
tijdens het aanroepen van een methode van UserAccount
, bijvoorbeeld user.getUserAccount().toString()
.
@Transactional
werkt alleen op de userService
niveau, in jouw geval. Om @Transactional
. te krijgen werkt, is het niet voldoende om de @Transactional
annotatie op een methode. Je moet een object van een klasse ophalen met de methode uit een Spring Context
. Dus om geld bij te werken, kunt u een andere servicemethode gebruiken, bijvoorbeeld updateMoney(userId, amount)
.
Als u @Transactional
. wilt gebruiken op de controller-methode moet je een controller krijgen uit de Spring Context
. En Spring zou moeten begrijpen dat het elke @Transactional
. moet inpakken methode met een speciale methode om een persistente context te openen en te sluiten. Een andere manier is om Session Per Request Anti-patroon te gebruiken. U moet een speciaal HTTP-filter toevoegen.
https://vladmihalcea.com/the-open-session- in-view-anti-patroon/