sql >> Database >  >> RDS >> Mysql

LazyInitializationException probeert een luie geïnitialiseerde instantie te krijgen

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/



  1. Een array doorgeven aan mysql

  2. Hoeveel kolommen mag je (maximaal) in een MySQL-tabel hebben?

  3. Hoe kan ik mySQL-database op mijn lokale locatie toegankelijk maken vanaf verschillende machines?

  4. PL/SQL Strong-referentiecursor met door de gebruiker gedefinieerd recordgegevenstype