Cascade.ALL来自非拥有实体方面

noi*_*i.m 1 hibernate cascade associations

我在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>();
}
Run Code Online (Sandbox Code Playgroud)

我在两者上都指定了CascadeType.ALL.物品是物主.将使用第三个表(Item_Category)映射ManyToMany关系

  1. 当我创建一个项目并向该项目添加类别并保存该项目时,该项目中的所有类别都会保持不变.此外,还在连接表中生成必要的条目(如预期的那样).

  2. 但是,当我创建一个类别并向其添加新项目并保存该类别时,我看到必须在项目和类别表中创建条目,但在Item_Category连接表中没有插入.因此,无法正确创建关联.

这是预期的行为吗?这意味着只有当我们在Item中添加类别时,关联表才会有条目,因为Item是关系的所有者?

Rya*_*art 5

你期待魔法,而Hibernate不是那样.保存破碎的对象模型会使事情破裂.如果Item和Category具有双向关系,则必须始终设置关系的两端.仅仅因为你有Hibernate并不意味着你的代码可以是懒惰的.

换句话说,你永远不会编写这样的代码并期望它能够工作,你会(假设一个工作assert关键字)吗?

Category c = new Category();
Item i = new Item();
c.getItems().add(i);
assert i.getCategories().contains(c);
Run Code Online (Sandbox Code Playgroud)

如果没有,为什么在将Hibernate添加到混合中时,您希望它能够正常工作?

  • 无论如何,我在hibernate网站上发现了这个"在双方设置链接的过程"对于双向链接是绝对必要的." 感谢您的回答. (2认同)