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/