0

いくつかの知識がある休止状態を使用して既存のアプリケーションを理解しようとしています。このアプリケーションでは、データベース スキーマが作成されており、DB スキーマからクラスが自動生成されています。

DB 内の 2 つのテーブルの例を見てみましょう。

   PERSON(id, firstname, surname)
   OBJECT(id, owner_id, description)

OBJECTowner_idは、 は への外部キーになりPERSON.idます。

生成されたクラスは、おおよそ次のようになります。

class Person {
  // ok for the following
  int id; // with getters and setters
  String firstname; // with getters and setters
  String surname; // with getters and setters

  // dunno why the following ?
  Set objects = new HashSet(0);
  Set getObjects() { return this.objects; }
  void setObjects(Set objects)  this.objects = objects; }
}

class Object {

   int id; // with getters and setters 
   Person owner; // with getters and setters
   String description;  // with getters and setters
}

まず、生成されたクラスで所有されているオブジェクトのセットへの参照がある理由がわかりませんPerson。次に、 HQL クエリを介してObjectまたはを取得した場合、このメンバーは完全にロードされていますか? それを確実にするには、どのように休止状態を設定する必要がありますか?List<Object>PersonObject

私のアプリケーションでは、別の実行可能ファイルとして実行されている休止状態セッションと、休止状態アプリと通信していくつかの永続オブジェクトを送信するように要求する別のデポートされたアプリケーションがあるため、私は尋ねています。を取得できますObjectが、作成したこのオブジェクトで にobject.getPerson().getFirstname()遭遇すると、org.hibernate.LazyInitializationException: could not initialize proxy - no Session

4

1 に答える 1

0

クライアント アプリケーションでは、'Object' オブジェクトの 'Person' フィールドの値が初期化されていない (値が割り当てられていない) ため、LazyInitializationException が発生します。Hibernate セッションを開かずに Hibernate エンティティの初期化されていないフィールドにアクセスしようとしているため、Hibernate はその値を取得できません。

あなたが言ったように、すべてのフィールドが初期化された「オブジェクト」インスタンスを受け取ることを確認する必要があります。Hibernate エンティティのマッピング方法に応じて、いくつかの可能性があります (より具体的な方法で回答できるように、マッピングを提供することをお勧めします)。たとえば、次のことができます。

  1. 関係を熱心にマークして、オブジェクトを取得するときに人物も取得するようにします (これを行う方法は、マッピングが宣言されている方法によって異なります)。
  2. オブジェクトをクエリするときは、明示的な結合を使用します。HQL でこのようなもの (HQL を使用しているかどうかもわかりません)

    select o from Object o join fetch o.owner where o.id = :id

繰り返しになりますが、詳細をお知らせいただければ、より正確な解決策を提供できます

于 2013-03-13T14:43:29.107 に答える