0

ID、名前、ステータスを持つクラスPersonがあります。statusはidを持つクラスStatusであり、status文字列はまもなく休止状態のnetbeansツールによって生成されるコードです。

class Person{
   long id;
   String name;
   Status status;
   //getters and setters
}
class Status{
   long id;
   String status;
   List<Person> persons;
   //getters and setters
}

問題は、セッションで人をマージしたいときにステータスがnullになることです

人p=getById(1L); //人名=XX; status = 1

p.setName( "YY");

session.merge(p); //ここでステータスはgetNULLです-nullではないプロパティはnullまたは一時的な値を参照します:model.Status

マージ時に休止状態でpersonオブジェクトが読み込まれることを知っているので、ステータスがnullとして返されるのはなぜですか?

4

2 に答える 2

0

遅延読み込みは、多対一の参照が他のオブジェクトの主キーを使用している場合にのみ機能します。また、one2many リレーションでアーキテクチャを作成することも避けてください。

person.hbm.xml ファイルでそのように使用します。

<set name="status" table="status" 
            inverse="true" lazy="false" fetch="select">
        <key>
            <column name="id" not-null="true" />
        </key>
        <one-to-many class="xxx.Status" />
 </set>

status.hbm.xml はそのようにする必要があります。

 <many-to-one name="person" class="xxx.Person" fetch="select">
      <column name="id" not-null="true" />
 </many-to-one>

役立つことを願っています。

于 2012-07-31T12:30:56.733 に答える
0

この場合、ステータスは null ではありませんが、一時的です。人物に含まれるをマージPersonする前にマージしようとしています。Statusしたがって、休止状態のコンテキストに、コンテキスト外の参照を持つエンティティを導入しようとしています。解決策は、人物をマージする前にステータスをマージするか、定義することCascadeType.MERGEです。

于 2012-07-31T12:25:17.767 に答える