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/