在使用Hibernate时,我对使用一对多/多对一关系的拥有方面的正确选择感到有些困惑。 我可以想象这种关系的两个例子:
如果我们从细节中抽象出来,两个例子的内部结构是相同的,比如
public class Order/Group implements Serializable {
private Integer id;
private Set<OrderLine/User> children = new HashSet<OrderLine/User>();
}
public class OrderLine/User implements Serializable {
private Integer id;
private Order/Group parent;
}
hibernate注释映射将分别为
@OneToMany(mappedBy = "parent")
@ManyToOne
@JoinColumn(name = "id", nullable = false)
逻辑上将OrderLine / User留给了拥有者。
上述用例是否对拥有方关系的选择产生影响?如果一个逆转拥有方或使用级联选项保存/删除父级就足够了?添加/删除一些子项然后使用orphanRemoval
(订单 - 订单行)或不使用它(组 - 用户)将父级保留到数据库是否正常?最后,哪一方应对某些操作负责,例如清除用户当前所在的组,或通过添加和删除项目来更改订单?
答案 0 :(得分:2)
实际上,你没有太多选择。在双向OneToMany关联中,所有者方总是多方(Hibernate有一些技巧可以使反转成为可能,但它很可怕,并且不受JPA,AFAIK支持)。
但是不要对这种所有权赋予过多的价值。它唯一意味着Hibernate只会考虑OrderLine(或User)中的parent
字段来确定是否存在关联。就这样。您可以随意组织代码,前提是您要记住如果要将OrderLine添加到订单时初始化父字段,并且如果要将其从订单中分离,则将其设置为null。 / p>