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。项目是所有者。多对多关系将使用第三个表 (Item_Category) 进行映射

  1. 当我创建一个项目并将类别添加到该项目并保存该项目时,该项目中的所有类别都会保留。在连接表中也有必要的条目(如预期的那样)。

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

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

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。多对多关联

> 仅对关联的反向端所做的更改不会保留 <

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

于 2014-03-06T14:15:25.643 回答