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

时间:2013-02-17 01:31:34

标签: hibernate associations cascade

我在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关系将使用第三个表(Item_Category)

进行映射
  1. 当我创建项目并向该项目添加类别并保存该项目时,该项目中的所有类别都会保持不变。此外,还在连接表中进行了必要的输入(如预期的那样)。

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

来自Hibernate ORM文档的site: Example 7.27. Many to many association

&GT;仅对关联的反向结束所做的更改不会保留

反向结束意味着如果你愿意,不拥有方。所以,是的,您应该调用拥有关系的一方的持久化方法来完全保留Item_Category表。