Hibernateがone-to-manyを構成する際に注意すべき事項


実はone-to-manyのマッピングを構成するのは簡単で、oneが代表するこのクラスに集合オブジェクトを追加して、一般的にsetを使って、対応するmanyが代表するそのクラスのオブジェクトを保存して、例えば、1つのpersonが複数のorderに対応して、(1人は複数の注文に対応して)、personクラスにprivate Setorderを追加します;このプロパティは、get、setメソッドを提供します.
次にPerson.hbm.xmlで構成します.
<set name="order" inverse="true" cascade="all">
   <key column="userid" />
   <one-to-many class="Order" />
</set>

 これにより、一方向の一対の多関係の構成が完了し、メインプログラムでorderオブジェクトを新規作成し、setに保存し、person.setOrder(set)を保存し、orderオブジェクトを保存し、personオブジェクトを保存すればよい.しかし、このような構成には大きな問題があり、データベースでの処理はまずorderテーブルとpersonテーブルにデータを挿入することであるが、orderテーブルの外部キー列はnullを挿入し、その後更新文を実行し、orderテーブルの外部キー列を更新し、それを対応するpersonidに設定する
次のコンソールから出力される情報:(personinfoではなくuserinfoのテーブルがあります)
Hibernate: insert into USERINFO (username, password, userid) values (?, ?, ?)Hibernate: insert into ORDERINFO (product, oid) values (?, ?)Hibernate: insert into ORDERINFO (product, oid) values (?, ?)Hibernate: insert into ORDERINFO (product, oid) values (?, ?)Hibernate: update ORDERINFO set USERID=? where oid=?Hibernate: update ORDERINFO set USERID=? where oid=?Hibernate: update ORDERINFO set USERID=? where oid=?
このように操作すると性能が悪くなり、
双方向の一対の複数の関連付けを設定すると、orderクラスにプロパティprivate Person personを追加し、get、setメソッドを提供し、Order.hbm.xmlで構成することができます.
、そしてメインプログラムでorder.set(person)を設定し、値(関連関係を制御)を設定し、その他は上記と同様にします.
コンソール出力情報は次のとおりです.
Hibernate: insert into USERINFO (username, password, userid) values (?, ?, ?)Hibernate: insert into ORDERINFO (product, USERID, oid) values (?, ?, ?)Hibernate: insert into ORDERINFO (product, USERID, oid) values (?, ?, ?)Hibernate: insert into ORDERINFO (product, USERID, oid) values (?, ?, ?)
データベースを操作する挿入文は4つしかありません.
 
双方向一対多の操作についていくつか注意してください:(李剛のJAVEEssh統合開発の本から引用)
1.oneの対象を永続化する
2.oneとmanyの関連付けを設定し、manyオブジェクトを保存します.そうしないと、先に挿入してから更新する重複操作データベースが発生します.
3.oneの端で関連関係を制御しないで、setのinverse=「true」を設定して制御したり、メインプログラムでsetを設定しないで2つのクラスを関連付けたりすることができます.
(inverseの意味は反転で、関係のどちらが所有者ownerなのかを設定し、彼がこの関係を維持するために使用されます.
役割は、1対の多双方向の関連関係の中で一方が相手の関係を維持することを放棄させることです(抽象).実は重複したSQL文の実行を減らすことです.
inverse=「false」がデフォルトであり、この場合反転がない場合、Set/Collection関係はその「一」を含む側によって次元化されます.
 
inverse="true"の場合は、Set/Collection関係が他方によって維持され、この関係を含まない一方によって維持されることを意味するので、「反転」と呼ぶ
 
インスタンス分析:
 Student(  ) Class(  )  ,              ,             ,            。

Class  :
Class Class{
  private int id;
  private String name;
  private Set students = new HashSet();
  //  getter() setter()  
}
 Student  :
Class Student{
  private int id;
  private String name;
  private Class class;
  //  getter() setter()  
}
 Class      :
<class name="Class" table="CLASS">
   <id name="id" type="int" column="ID">
     <generator class="native" />  
   </id>
   <property name="name" type="string" column="NAME" />
   <set name="students" table="STUDENT" cascade="save-update" inverse="false">
     <key column="CLASS_ID" />
     <one-to-many class="Student" />
   </set>
</class>
Student      :
<class name="Student" table="STUDENT">
   <id name="id" type="int" column="ID">
      <generator class="native" />  
   </id>
   <property name="name" type="string" column="NAME" />
   <many-to-one name="class" column="CLASS_ID" class="Class" cascade="save-update" /> 
</class>
 
STUDENT        CLASS_ID   ,  CLASS   ID        。  inverse           (Student Class)           。

inverse     false。         ,  :
Class c1 = new Class();
c1.setName("  ");
Student s1 = new Student();
Student s2 = new Student();
s1.setName("Jason");
s2.setName("Tom");
c1.getStudents().add(s1);
c2.getStudents().add(s2);
s1.setClass(c1);
s2.setClass(c1);   //  1
session.save(c1);

       Hibernate    SQL  ,      insert    ,    update    。       ,             ?    Class      <set>      inverse="false",    Hibernate:STUDENT  CLASS         Class     。   save ,     insert  ,              STUDENT  ,   CLASS_ID     s1.getClass().getID()   ,      “  1”    s2.setClass(c2);(c2    Class  ,        ),  ,          。         ,Hibernate            update     STUDENT          CLASS_ID  ,  ,  CLASS_ID       c1       ,    s1.getClass().getID()   。
     Class      <set>    inverse     true,     Hibernate:Class          ,        Student 。  ,          ,Hibernate       insert  ,       update  。  Hibernate   Student  s1.getClass().getID() s2.getClass().getID()   CLASS_ID    。
 ,         ,      update  ,                 ,    inverse     true,               。
    :      ,            ,            ?