3

テーブルの親と子の間に多対多の関係があります。

これは、この関係をマッピングする Parent クラスの一部です。

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "parents_children", 
            joinColumns = { @JoinColumn(name = "PARENT_ID", nullable = false, updatable = false) }, 
            inverseJoinColumns = { @JoinColumn(name = "CHILD_ID", nullable = false, updatable = false) })
protected Set<Child> children = new HashSet<Child>();

ここに私の子クラスの部分があります:

@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER, mappedBy = "children")
protected Set<Parent> parents;

childこれは、1 つの Child オブジェクトが として定義され、1 つの Parent オブジェクトがとして定義されている場合、子を追加しようとすると親側から機能しますparent

parent.getChildren().add(child);

これはデータベースで正しく更新され、エントリがparents_childrenテーブルに保存されます。

ただし、反対側からやろうとすると、子から親を設定したい。私がSet<Parent> parents定義しupdateParents()、クラス内で定義されたメソッドがあり、Children定義されたdbから1つの子をロードしchild、これを試した場合:

public void updateParents() {
    Set<Parent> parents = //get this from somewhere

    child.setParents(parents);
    update();
}

これはうまくいかず、その理由を理解しようとしています。メソッドを次のように変更すると機能します。

public void updateParents() {
  Set<Parent> parents = //get this from somewhere

  for (Parent parent : parents) {
    parent.getChild().add(this);
  }
}

リレーションの定義に何か問題がありますか? しばらく Java を使っていないので、これを思い出すのに苦労しています。

親を子オブジェクトに追加できるように、誰かが私が間違っていることを指摘できますか?

4

2 に答える 2