1

私の問題を例で説明します。私のJSPログインページでは、正しいログインごとに「ユーザー」と呼ばれるオブジェクトのインスタンスが配置され、ユーザーのログインデータがHttpSession( session.setAttribute("user",userObject))に保持されます。そのオブジェクトの作成方法は、そのユーザーのユーザー名とパスワードがチェックされ、インスタンス( User オブジェクトの 'User') は、HibernateSession から取得されます。
別のページで、上記の設定した userObject を HttpSession から取得すると、エラーなくオブジェクトを取得できます。しかし、そのメソッドが呼び出されると、例外が発生org.hibernate.LazyInitializationException: could not initialize proxy - no Session します。以前に配置したにもかかわらず、HttpSession からその userObject を取得できないのはなぜですか?

セッションに追加する前にオブジェクトに値があったにもかかわらず、空のオブジェクト(インスタンス変数に値がない)がHttpSessionに存在するのはなぜですか?

4

2 に答える 2

2

Userこれは、エンティティに遅延フェッチされるコレクションプロパティがある場合に発生する可能性があります。コレクションは、呼び出し元が実際にDBからのデータにアクセスする必要がある場合にのみ、実際にDBからのデータで満たされます。これはsize()、が取得さiterator()れたときとまったく同じHibernateセッション内で発生する必要があります。User適切に設計されたWebアプリケーションでは、Hibernateセッションの有効期間は1つのHTTP要求/応答だけです。したがって、コレクションプロパティへのアクセスが別のHibernateセッションで発生した場合(別のHTTPリクエストを読んでください)、この例外が発生します。

これを修正するには、コレクションプロパティを熱心にフェッチするか、コレクションプロパティでを使用Hibernate#initialize()してを取得する必要がありますUser

参照:

于 2012-04-26T12:57:47.320 に答える
1

これは遅延読み込みの問題です。異なるデータベース エンティティ (子オブジェクトのリストなど) に格納されている要素は、メイン インスタンス (ユーザー オブジェクト) に直接読み込まれるのではなく、後で実際にアクセスされたときに読み込まれます。利点は、実際に使用されるオブジェクトのみをデータベースからロードする必要があることです。

これらの余分なオブジェクトを遅延読み込みで読み込むには、Hibernate にセッションが必要です。これは、メイン インスタンスをロードするために最初に使用されたセッションです。このインスタンスはセッションにバインドされています。その間にセッションが閉じられた場合は、取得したエラー メッセージが正確に表示されます。たとえば、この順序で行う場合

userObject = session.load(...);
session.close();
userObject.getChildObjects(...); // or whatever the method fetching extra objects is called

その後、エラーメッセージが表示されます。

このエラーを回避するためにできること: たとえば

  • セッションを閉じないでください
  • 子オブジェクトのクラス マッピングで遅延読み込みを無効にする
  • userObject.getChildObjects(...);その瞬間にフェッチされたオブジェクトを使用しない場合でも、セッションを閉じる前に呼び出します。

メインの userObject を HttpSession に格納することは基本的に問題ありませんが、オブジェクトがそこにある間に Hibernate セッションを閉じた可能性があります。

于 2012-04-26T13:11:34.480 に答える