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/