0

Hibernate を使用した Spring MVC (3.1) Web アプリがすべて正常に動作しています。今日、構成をアノテーション ベースの構成に完全に移行しようとしました (コード構成で Spring によってまだサポートされていないセキュリティ要素には xml のみを使用)。 )。

いくつかの調整の後、エラーなしでアプリを開始し、ホームページが正しく読み込まれました - ただし、Hibernate セッションでいくつかの異なる動作が見られます - つまり、実際に Hibernate エンティティに触れるページを読み込むときに次のエラーが発生します:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.tmm.web.domain.Profile.connections, no session or session was closed

これは、次のシナリオで発生しています。

  1. リクエストがヒットし、ユーザーオブジェクト@ControllerをロードしますProfile
  2. 同じメソッド呼び出しで (したがって、ここでは切り離されたエンティティなどについては話していません)、呼び出しを試みますprofile.getConnections()
  3. Profile.connections は実際には fetchtype を明示的に指定していないため、デフォルトで熱心な読み込みを行う必要があります (私の理解ですか?) が、いずれにせよ、getConnections()呼び出しはの読み込みの直後にprofile行われるため、遅延読み込みされていたとしても、 DB に戻り、必要に応じて接続をロードするだけです。

    //@Controller コード Account viewsUser = accountService.loadAccountByUserName(userName); model.put("viewedUserConnections"、viewedUser.getUserProfile().getConnections());

    //Profile Entity @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List connections = new ArrayList();

今、私は遅延読み込みなどについて知っているので、それについての質問ではありません-すべてのHibernateが正しく機能していると述べたように-本当に私の質問は、どのSpring構成がこの動作に影響を与える可能性があるかです?

前後のxmlと注釈構成を投稿できますが、切り替えで見逃した可能性のある構成の方向を誰かが教えてくれることを願っています。

4

1 に答える 1

2

あなたの仮定は主に間違っています:

同じメソッド呼び出しで(したがって、ここでは切り離されたエンティティなどについては話していません)

メソッドはコントローラのメソッドです。典型的な Spring アプリケーションでは、コントローラーはトランザクション対応ではありませんが、サービスはトランザクション対応です。そのため、「ビューでセッションを開く」フィルターまたはインターセプターを構成しない限り、トランザクション サービス メソッドが戻るとセッションが閉じられるため、コントローラーは常に切り離されたエンティティを使用します。

Profile.connections は実際には fetchtype を明示的に示していないため、デフォルトで熱心なロードにする必要があります

いいえ。XxxToMany 関連付けは、デフォルトで遅延しています。

移行前に同じコードが機能していた場合は、ビュー フィルターまたはインターセプターで開いているセッションがあり、注釈に移行するときにそれを忘れていたと思います。

于 2013-05-19T18:13:11.167 に答える