0

私はコンテナー管理トランザクションを持っており、そのトランザクションに関連付けられたエンティティマネージャーを持つ 1 つのメソッドを使用しています。私が持っているテーブルは、親テーブルと、親テーブルの子を含む別のテーブルの関連付けです。

同じセッションで、以下の順序で次の項目を実行します。最初のセッションでは、親オブジェクトも子オブジェクトもありません。ただし、親オブジェクトは DB に存在し、子はメソッドに追加されます。に興味がある 。

  1. セッションで DB から親オブジェクトを取得するため、この親オブジェクトはセッションに含まれます。
  2. 新しい子レコードを作成し、この子を親テーブルに関連付けます。親はセッション休止状態の一部であるため、子テーブルに子レコードを正しく追加する必要があります??
  3. 次に、この時点でフラッシュを実行します。
  4. 再び、親のコレクションに新しい子を追加します
  5. 前に述べたように、休止状態はそれを儀式に追加する必要がありますか?
  6. 現在、再度フラッシュを実行しています。
  7. EJB トランザクションの最後に、休止状態は他のすべての SQL ステートメントを生成します。

これらの操作を実行した後、DB では、2 回目に追加された子のみが親テーブルに関連付けられていることがわかります。しかし、最初の子エントリには存在しますが、親の関連付けが設定されていません。

子を追加する間にフラッシュを削除すると、両方の子が親に正しく関連付けられます。ここでフラッシュが問題を引き起こしていますが、ここでフラッシュを使用する必要があります。フラッシュを実行し、後で別の 10 の子を関連付けてから、最後の 10 の子のみを親に関連付けてフラッシュを実行します。他のすべての子は孤立した段階にあります。これは私にとって問題を引き起こしています!:(

この問題を解決する方法についてコメントしてください。フラッシュの前に update や saveOrUpdate などの他の操作を実行する必要がありますか?

アルゴリズムはここにあります 見つけてください : コードは大きくて長いので、操作がどのように実行されるかのアルゴリズムを投稿します 2 つのテーブルがあると仮定します。エンティティは親エンティティから拡張されます 最初は DB に親レコードが 1 つしかなく、子テーブルに CHILD レコードがないと仮定します 子と親の間に一対多およびその逆の双方向リンクがあります。トランザクションの開始時に、親が Persistence Context に関連付けられるように、DB から親データを取得します。ここで、子の新しい POGO オブジェクトを作成し、そのデータを入力するとします。このようなオブジェクトを 20 個作成し、子から親へ、および親から子への双方向の両方を関連付けるとします。親は休止状態のコンテキストにあるため、子休止状態に関連付けると、リンクの作成と作成が処理されます。ここで、セッション コンテキストでフラッシュを実行するとします。次に、子の POGO オブジェクトをさらに 10 個作成し、同じ関連付けを親に行い、再度フラッシュを実行します。

after the end of transaction when i check the DB i see that the first 20 entries are there in the DB but the association for them to parent is absent. But for the last added 10 Child objects both the entries and the association for the parent is there.

When i remove the flush in between adding the child between 20- and 10 i see that all the 30 are correctly getting associated. I want to know why the flush is causing the problem.

4

1 に答える 1

0

You need to take special care if you use a bi-directional relation as described in the hibernate reference:

<class name="Person">
 <id name="id" column="personId">
     <generator class="native"/>
 </id>
 <many-to-one name="address"          column="addressId"         not-null="true"/>
</class> 
<class name="Address">
 <id name="id" column="addressId">
     <generator class="native"/>
 </id>
 <set name="people" inverse="true">
     <key column="addressId"/>
     <one-to-many class="Person"/>
 </set>
</class>

In this case, if you add a person to address.people, but person.address is null, hibernate will not save the person, because the address.people relation is inverse="true".

You need to set both directions of the relation for hibernate to save it correctly:

public void addPerson(Person person) {
    person.setAddress(this);
    this.people.add(person);
}

See 1.2.6 Working bi-directional links in the hibernate tutorial.

于 2013-09-24T14:01:03.813 に答える