sql >> データベース >  >> RDS >> Mysql

遅延初期化されたインスタンスを取得しようとしているLazyInitializationException

    まず、問題の根本はトランザクションではないことを理解する必要があります。トランザクションと永続的なコンテキスト(セッション)があります。 @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 /



    1. DATE型列のデフォルト値を時間部分のない現在の日付に設定しますか?

    2. PHPMyAdminを使用したcPanelでのMySQLデータベースの管理

    3. Spring Integrationとは何ですか?

    4. XMLAを取得してキューブ構造を分析する