Hibernate设置为一对多/多对一关系

时间:2012-12-14 16:45:56

标签: hibernate

在使用Hibernate时,我对使用一对多/多对一关系的拥有方面的正确选择感到有些困惑。 我可以想象这种关系的两个例子:

  1. Order / OrderLine对是第一个例子。在这一对中,Order具有“主”角色。一个人想保存订单,因此保存所有项目。
  2. 对组/用户是第二个例子。在这对中,用户具有“主”角色。人们宁愿通过将用户分配给某个组来保存用户。
  3. 如果我们从细节中抽象出来,两个例子的内部结构是相同的,比如

    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(订单 - 订单行)或不使用它(组 - 用户)将父级保留到数据库是否正常?最后,哪一方应对某些操作负责,例如清除用户当前所在的组,或通过添加和删除项目来更改订单?

1 个答案:

答案 0 :(得分:2)

实际上,你没有太多选择。在双向OneToMany关联中,所有者方总是多方(Hibernate有一些技巧可以使反转成为可能,但它很可怕,并且不受JPA,AFAIK支持)。

但是不要对这种所有权赋予过多的价值。它唯一意味着Hibernate只会考虑OrderLine(或User)中的parent字段来确定是否存在关联。就这样。您可以随意组织代码,前提是您要记住如果要将OrderLine添加到订单时初始化父字段,并且如果要将其从订单中分离,则将其设置为null。 / p>