为什么双向 @OneToMany 在没有第二次保存的情况下工作()

Why does bidirectional @OneToMany work without second save()

根据 this fabulous article by Thorben Janssen @OneToMany 的双向关联是这样工作的:

Item item3 = new Item();
item3.setName("Third Item");
item3.setOrder(order);
em.persist(item3);
 
order = em.find(PurchaseOrder.class, orderId);
order.getItems().add(item3);

换句话说,

  1. 保留@ManyToOne 关系的所有者
  2. 只需将所有者添加到@OneToMany 实体,您甚至不需要第二次调用 save()

现在,这是为什么呢?我实现了这一点,并进行了一些测试,只是为了做到这一点。就我个人而言,这是高度混淆的休眠魔法,这种行为没有意义。

这就是为什么我想更深入地研究 Hibernate 的工作原理,所以我试图了解这里到底发生了什么。我知道实体与休眠持久层相关联,但从这里开始我的知识变得有点不稳定。

要了解正在发生的事情,您需要熟悉 Hibernate ORM entity states

在您的例子中,两个实体都被管理,因此 Hibernate ORM 知道它需要应用更改。 item3 被管理是因为它已被持久化,order 被管理是因为它是 find.

的结果

session.save 的 javadoc 开头为:

Persist the given transient instance ...

None 个实体在这种情况下是暂时的。

请注意,您可以更改示例,具体取决于您如何将关联映射到不同 cascade types

例如,如果使用 CascadeType.PERSIST 映射关联 items,这也有效:

Order order = new Order();

Item item3 = new Item();
item3.setName("Third Item");

item3.setOrder(order);
order.getItems().add(item3);

// Both entities are transient in this case
em.persist(order);