sql >> Databasteknik >  >> RDS >> Mysql

LazyInitializationException försöker få lazy initierad instans

För det första bör du förstå att roten till problemet inte är en transaktion. Vi har en transaktion och ett ihållande sammanhang (session). Med @Transactional annotation Spring skapar en transaktion och ett öppet beständigt sammanhang. Efter att metoden anropats stängs ett beständigt sammanhang.

När du anropar en user.getUserAccount() du har en proxyklass som omfattar UserAccount (om du inte laddar UserAccount med User ). Så när ett beständigt sammanhang stängs har du en LazyInitializationException under anrop av någon metod för UserAccount , till exempel user.getUserAccount().toString() .

@Transactional fungerar bara på userService nivå, i ditt fall. För att få @Transactional fungerar, räcker det inte att sätta @Transactional anteckning om en metod. Du måste hämta ett objekt av en klass med metoden från en Spring Context . Så för att uppdatera pengar kan du använda en annan servicemetod, till exempel updateMoney(userId, amount) .

Om du vill använda @Transactional på kontrollmetoden behöver du få en kontrollenhet från Spring Context . Och Spring borde förstå att den bör linda varje @Transactional metod med en speciell metod för att öppna och stänga ett beständigt sammanhang. Ett annat sätt är att använda Session Per Request Anti-mönster. Du måste lägga till ett speciellt HTTP-filter.

https://vladmihalcea.com/the-open-session- in-view-anti-pattern/



  1. Laravel PDOException SQLSTATE[HY000] [1049] Okänd databas 'forge'

  2. Ska jag använda !=eller <> för inte lika i T-SQL?

  3. C# ringer oracle lagrad funktion

  4. Infoga uppdatering lagrad proc på SQL Server