1

Item と Category の間に @ManyToMany (双方向) の関係があります。

class Item {
  @ManyToMany(cascade = CascadeType.ALL)
  Collection<Category> categories=new ArrayList<Category>();
}

class Category {
  @ManyToMany(mappedBy="categories", cascade = CascadeType.ALL)
  Collection<Item> items=new ArrayList<Item>();
}

両方に CascadeType.ALL を指定しました。アイテムは所有者です。ManyToMany 関係は、3 番目のテーブル (Item_Category) を使用してマップされます。

  1. アイテムを作成し、そのアイテムにカテゴリを追加してアイテムを保存すると、そのアイテム内のすべてのカテゴリが保持されます。また、結合テーブルに必要なエントリが作成されます (予想どおり)。

  2. ただし、カテゴリを作成して新しいアイテムを追加し、カテゴリを保存すると、必要なエントリがアイテム テーブルとカテゴリ テーブルに作成されますが、Item_Category 結合テーブルには挿入されません。その結果、関連付けが正しく作成されません。

これは予想される動作ですか?アイテムが関係の所有者であるため、アイテムにカテゴリを追加した場合にのみ、関連付けテーブルにエントリが含まれることを意味しますか?

4

2 に答える 2

5

あなたは魔法を期待していますが、Hibernate はそうではありません。壊れたオブジェクト モデルを保存すると、壊れたままになります。Item と Category に双方向の関係がある場合は、常に関係の両端を設定する必要があります。Hibernate を使用しているからといって、コードが遅延する可能性があるわけではありません。

別の言い方をすれば、このようなコードを書いて、それが機能することを期待することは決してないでしょう (assertキーワードが機能すると仮定して) でしょうか?

Category c = new Category();
Item i = new Item();
c.getItems().add(i);
assert i.getCategories().contains(c);

そうでない場合、Hibernate をミックスに追加すると、なぜそれが機能すると期待するのですか?

于 2013-02-17T01:48:20.167 に答える
1

Hibernate ORM ドキュメントのサイトから: 例 7.27。多対多の関連付け:

> 関連付けの逆端のみに加えられた変更は保持されません <

必要に応じて、所有していない側を意味する逆の端。そうです、リレーションシップを所有する側の persist メソッドを呼び出して、Item_Category テーブル全体を永続化する必要があります。

于 2014-03-06T14:15:25.643 に答える