2016-03-30 16 views
0

これは私のOrderSet.hbmファイルです。これは、子(1対多)の関係としてを持っています。cascade = "all-delete-orphan" inverse = "true"は一緒に動作しますか?

<list name="orderSetMembers" lazy="true" cascade="all-delete-orphan" inverse="true"> 
    <key column="order_set_id" not-null="true"/> 
    <list-index column="sequence_number"/> 
    <one-to-many class="OrderSetMember" /> 
</list> 

これは私のOrderSetMember.hbmファイルです。 は親と多対1の関係を持っています。私は双方向マッピングが欲しかった。

<many-to-one name="orderSet" class="OrderSet"> 
    <column name="order_set_id"/> 
</many-to-one> 

親と子の両方を1つのsession-saveコマンドで保存できますか? また、子を保存するために別のセッションを保存する必要がありますか?

Session session = sessionFactory.getCurrentSession(); 
session.saveOrUpdate(orderSet); 

これらは私のデータモデルです:

public class OrderSet { 
    private List<OrderSetMember> orderSetMembers; 
} 


public class OrderSetMember { 
    private OrderSet orderSet; 
} 

答えて

0

cascadeinverseは、2つの完全に異なる目的を持っています。

cascadeは、親に適用されたときにどのエンティティライフサイクル操作が子(ren)に自動的に適用されるべきかを示します。

inverseは、その子供が協会の所有者であることを意味します。つまり、子側の親に子を関連付けないと、関係情報はデータベースと同期化されません。例えば

、あなたが親エンティティインスタンスでorderSetMembersコレクションにを追加していますが、インスタンスにorderSetフィールドnullを残し、その後session.saveOrUpdate(orderSet)を起動すると、結果は次のようになります。

  1. 両方をOrderSetとのインスタンスがデータベースに保存されます(saveは子にカスケードされます)。
  2. order_set_id(がマッピングされる表の外部キー)は、nullに設定されます。これは、がアソシエーションの所有者であり、Hibernateがダーティチェック時にアソシエーションの所有者を検査したときに関連付けられたOrderSetエンティティがなかったためです。
  3. 上記のOrderSetインスタンスを新しいセッションで読むと、がorderSetMembersコレクションにも存在しないことがわかります。
関連する問題