7

私は一対多の関係を作成しています。だから、私には親と子がいます。カスケード属性はすべてに設定されます。

次のコードを考えれば、私は疑問に思っていました:

Parent p = (Parent) session.load(Parent.class, pid); 
Child c = new Child("child element");
p.addChild(c);
session.flush();
  • Q1) のように親がリレーションシップを所有している場合、親 inverse=false の場合、子要素の追加はデータベースで更新されますか?
  • Q2) 親が inverse=true の場合のように、子が関係を所有している場合、子要素の追加はデータベースで更新されますか?
  • Q3) リレーションシップの所有者は、更新が表示されるかどうかという点で、上記のコードに違いはありませんか?

どうもありがとう

4

4 に答える 4

5

逆の場合=false:

この場合、子とその関係を保存更新するのは親の責任です。したがって、あなたの例では、子はデータベースで更新されます。2つのSQLクエリがあります:1)子を挿入します。2)親IDの外部キーで子を更新します。

ケースインバース=true:

この場合、自分自身を保存-更新するのは子供の責任です。したがって、コードでは、子はデータベースに保存されますが、親の外部キーはnullになります。実行されるSQLクエリは1つだけで、それは子の挿入です。親の外部キーを更新するには、子を手動で保存する必要があります。

Child child = new Child();
child.setParent(parent);
session.save(child);

私は、これらのケースの答えがあなたの3番目の質問の答えを説明していると思います。

この助けを願っています。

于 2011-06-21T11:25:01.757 に答える
3

逆は、外部キーが 2 回 (通常は 1 対多と多対 1 として) マッピングされるため、片側からのみ格納する必要があることを NH に通知するだけです。

Q1) 子はカスケードで格納されますが、親の FK が null です。(ただし、 内の子に親リレーションを設定しますp.addChild(c)。)

Q2) Q1と同じ。

Q3) まさに。

于 2011-06-21T14:59:29.973 に答える
1

inverse=true を使用している場合、子が関係シップを更新する責任があることを意味します。必須の子オブジェクトには親オブジェクトが含まれている必要があります。そうでない場合、外部キーは更新されません。

于 2016-07-20T09:14:44.533 に答える
0

2 つの異なるエンティティ間の親子関係では、

例: 1 対多 (1:N) または多対 1 (N:1)

親 <-> 子。(所有者) (逆)

親が所有者の場合、子はその逆です。

逆を使用すると、常に子がチェックされます。

デフォルトでは、常に親側から考慮します。したがって、デフォルトで inverse = false は、親が所有者であることを意味します。

inverse= true の場合、子は所有者です。したがって、エンティティの永続化は常に所有者側から行われます。

于 2016-08-02T17:51:46.580 に答える