3

質問を参照する双方向のManyToManyを保存する私は、受け入れられた答えが間違っていると説明したものを正確に取得したい:

A a1 = new A();
A a2 = new A();
B b = new B();
a1.getB().add(b);
b.getA().add(a2);

この状態が持続する可能性がある場合、結合テーブルに次のエントリが作成されます。

a1_id, b_id
a2_id, b_id

しかし、ロード時に、 a1 ではなく a2 についてのみ b に通知するつもりだったことを JPA はどのようにして知るのでしょうか? b について知ってはならない a2 はどうですか?

私の場合、すべての状況で b が a1 と a2 について知っていることは正しいです。

親子関係を考える:

  1. b は a1 の親であり、かつ a1 は b の子です (当然)

私にとって、方向を 1 つだけ定義するのは誤りです。

  1. b は a1 の親であり、かつ a1 は b の子ではありません (???)

受け入れられた答えが説明しているものを取得するには、2つの結合テーブルが必要だと思います:

a_has_b:
a1_id, b_id

b_has_a
b_id, a2_id

私が間違っている??

  1. ただし、「同期された」双方向の関係 (ManyToMany だけでなく) を取得する方法は?
  2. 標準のJPA機能で可能ですか?
  3. それ以外の場合、特定のプロバイダーの実装はありますか?

実装していると思います

...
public void addB(A a)
{
    getA().add(a);
    a.getB().add(this);
}

本当に醜いハックです...

両側で2つの単方向OneToManyを使用しても、EclipseLink 2.2.0では機能しません(よくわかりません、現在試しています)

どうも :)

4

3 に答える 3

3

を使用して、

public void addA(A a)
{
    getA().add(a);
    a.getB().add(this);
}

ハックではありません。これは優れたオブジェクト指向プログラミングです。どの Java モデルでも、永続性を無視して、双方向の関係がある場合は、関連するものを修正するために両側に追加する必要があります。永続性を使用している、または使用していないという理由だけで、コードを変更するべきではありません。

リレーションシップを個別に維持する場合は、2 つの異なる結合テーブルが必要です。単一の ManyToMany 関係が必要な場合 (そうであるようです)、@ManyToMany を使用して、mappedBy を片側に設定する必要があります。

http://en.wikibooks.org/wiki/Java_Persistence/ManyToManyを参照してください 。

于 2013-07-09T13:28:43.757 に答える
1

非所有側からの更新で問題に直面しました。@ManyToMany と @JoinTable を両側に配置しました (mappedBy はありません)。それはうまく機能しています。Hibernate 4.1.10.Final を使用しています。ウィキのドキュメントによると、それは正しくありません。混乱している ??

于 2013-07-09T08:59:16.327 に答える