Hibernate inverse =“true”保存父级在cascade =“all”

时间:2015-09-03 14:25:13

标签: java hibernate

当我读到有关级联和反向时,据说两者都做了完全不同的事情。 级联:在级联中,在完成一个操作(保存,更新和删除)之后,它决定是否需要在彼此有关系的另一个实体上调用其他操作(保存,更新和删除)。 反向:这用于决定哪一方是关系所有者来管理关系(插入或更新外键列)。​​

假设我保存了有孩子的父母。所以当我设置一对多的逆=“真”cascade =“all”一方面我希望那个孩子是关系的所有者,所以保存父母应该改变孩子的集合,但是当我 添加cascade =“all”hibernate会改变这种行为并坚持孩子。

那么如果级联改变了反向的行为,它们是如何不同的?

1 个答案:

答案 0 :(得分:1)

让我们举个例子:

  • 一个订单有很多行:OneToMany协会
  • 许多行共享一个父订单:ManyToOne association

业主方是Line。反面是订单。

这意味着,如果您坚持Order,请坚持Line,将该行添加到集合Order.lines,但不要设置Line.order,Hibernate将考虑这两个实体之间不存在任何关联。为什么?因为您只设置了关联的反面(Order.lines),而不是所有者端(Line.order)。

Cascade与此无关。我们假设Order.lines使用cascade=PERSIST进行注释。这意味着,如果您创建Order,请创建Line,将Line添加到Order.lines,并保留订单,Hibernate也会自动调用persist()Line上。因此Line将被保留,而不必明确地使用此行调用persist()。但是这两个实体之间的关联仍然没有保存在数据库中,因为您仍然没有设置关联的所有者方:Line.order