Mysql
 sql >> Baza danych >  >> RDS >> Mysql

LazyInitializationException próbuje uzyskać leniwą zainicjowaną instancję

Po pierwsze, powinieneś zrozumieć, że źródłem problemu nie jest transakcja. Mamy transakcję i trwały kontekst (sesję). Z @Transactional adnotacja Spring tworzy transakcję i otwiera trwały kontekst. Po wywołaniu metody trwały kontekst zostaje zamknięty.

Kiedy wywołujesz user.getUserAccount() masz klasę proxy, która otacza UserAccount (jeśli nie wczytasz UserAccount z User ). Więc kiedy trwały kontekst jest zamknięty, masz LazyInitializationException podczas wywołania dowolnej metody UserAccount , na przykład user.getUserAccount().toString() .

@Transactional działa tylko na userService w twoim przypadku. Aby uzyskać @Transactional pracy, nie wystarczy wstawić @Transactional adnotacja do metody. Musisz pobrać obiekt klasy z metodą z Spring Context . Aby zaktualizować pieniądze, możesz użyć innej metody usługi, na przykład updateMoney(userId, amount) .

Jeśli chcesz użyć @Transactional w metodzie kontrolera musisz pobrać kontroler z Spring Context . A Spring powinien zrozumieć, że powinien zawijać każdy @Transactional metoda ze specjalną metodą otwierania i zamykania trwałego kontekstu. Innym sposobem jest użycie wzorca Anti Session Per Request. Musisz dodać specjalny filtr HTTP.

https://vladmihalcea.com/the-open-session- anty-wzorzec-w-widoku/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyciągnij rekordy z tabeli zamówień na bieżący tydzień

  2. Jak mogę zoptymalizować funkcję ORDER BY RAND() MySQL?

  3. Jak dodać kolumnę automatycznego przyrostu w istniejącej tabeli w MySQL?

  4. Procedura składowana MYSQL dla zmiennych aktualizacji to 0

  5. Jak obliczyć procentowy wzrost z tygodnia na tydzień w MySQL?