まず、問題の根本はトランザクションではないことを理解する必要があります。トランザクションと永続的なコンテキスト(セッション)があります。 @Transactional
を使用 アノテーションSpringはトランザクションを作成し、永続コンテキストを開きます。メソッドが呼び出された後、永続コンテキストは閉じられます。
user.getUserAccount()
を呼び出すとき UserAccount
をラップするプロキシクラスがあります (UserAccount
をロードしない場合 User
を使用 )。したがって、永続コンテキストが閉じられると、LazyInitializationException
が発生します。 UserAccount
の任意のメソッドの呼び出し中 、たとえばuser.getUserAccount().toString()
。
@Transactional
userService
でのみ機能します レベル、あなたの場合。 @Transactional
を取得するには 動作します。@Transactional
を配置するだけでは不十分です。 メソッドのアノテーション。 Spring Context
からメソッドを使用してクラスのオブジェクトを取得する必要があります 。したがって、お金を更新するには、別のサービスメソッドを使用できます。たとえば、updateMoney(userId, amount)
。
@Transactional
を使用する場合 コントローラメソッドでは、Spring Context
からコントローラを取得する必要があります 。そして、Springは、すべての@Transactional
をラップする必要があることを理解する必要があります。 永続コンテキストを開いたり閉じたりするための特別なメソッドを持つメソッド。もう1つの方法は、Session PerRequestAntiパターンを使用することです。特別なHTTPフィルターを追加する必要があります。
https://vladmihalcea.com/the-open-session- in-view-anti-pattern /