sql >> Databáze >  >> RDS >> Mysql

LazyInitializationException se pokouší získat líně inicializovanou instanci

Za prvé byste měli pochopit, že kořenem problému není transakce. Máme transakci a trvalý kontext (relaci). S @Transactional anotace Spring vytvoří transakci a otevře trvalý kontext. Po vyvolání metody se trvalý kontext uzavře.

Když zavoláte user.getUserAccount() máte třídu proxy, která obaluje UserAccount (pokud nenačtete UserAccount s User ). Takže když je trvalý kontext uzavřen, máte LazyInitializationException během volání jakékoli metody UserAccount , například user.getUserAccount().toString() .

@Transactional fungující pouze na userService úrovni, ve vašem případě. Chcete-li získat @Transactional práce, nestačí vložit @Transactional anotace k metodě. Potřebujete získat objekt třídy pomocí metody z Spring Context . K aktualizaci peněz tedy můžete použít jinou metodu služby, například updateMoney(userId, amount) .

Pokud chcete použít @Transactional u metody ovladače musíte získat ovladač z Spring Context . A Spring by měl pochopit, že by měl zabalit každý @Transactional metoda se speciální metodou k otevření a uzavření trvalého kontextu. Jiný způsob je použití vzoru Session Per Request Anti. Budete muset přidat speciální HTTP filtr.

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



  1. Jak RLIKE funguje v MariaDB

  2. 3 způsoby, jak najít pozici podřetězce v řetězci v MySQL

  3. Jak získat aktuální datum a čas v MySQL

  4. Jak ručně nastavit počáteční hodnotu na 1000 v MySQL