我在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)
进行映射当我创建项目并向该项目添加类别并保存该项目时,该项目中的所有类别都会保持不变。此外,还在连接表中进行了必要的输入(如预期的那样)。
但是,当我创建一个类别并向其中添加新项目并保存该类别时,我看到必须在项目和类别表中创建条目,但在Item_Category连接表中没有插入。因此,无法正确创建关联。
这是预期的行为吗?这意味着只有当我们在Item中添加类别时,关联表才会有条目,因为Item是关系的所有者吗?
答案 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表。