使用JoinTable(带有OrderColumn)删除OneToMany / ManyToOne双向关系中的重复

时间:2010-12-10 22:52:11

标签: java hibernate jpa persistence jpa-2.0

我使用连接表有一个OneToMany / ManyToOne双向关系。这些孩子都在列表中,并且已经订购。

以下是设置:

父:

@OneToMany(cascade=CascadeType.ALL)
@JoinTable(
    name="parent_child",
    joinColumns=@JoinColumn(name="parent_id"),
    inverseJoinColumns=@JoinColumn(name="child_id")
)
@OrderColumn(name="child_order")
public List<Child> getChildren() {
    return children;
}

子:

@ManyToOne
public Parent getParent() {
    return parent;
}

这是我的问题:父表是预期的,但这里是child和parent_child表:

子:

int8 id,
int8 parent_id <---

parent_child:

int8 parent_id, <---
int8 child_id,
int8 child_order

与parent_id有重复 - 它在连接表和子表中指定,这意味着可以调用parent.getChildren()。get(0).getParent()并以不同于您的父级结束开始于,这应该是不可能的(我希望在数据库级别强制执行)。

我能看到解决这个问题的唯一方法是在子节点中使用连接列,而根本不使用连接表。但是我不喜欢那样,因为那时我必须将命令移到孩子身上,加上hibernate docs说应该避免使用带OneToMany的JoinColumn(但他们并没有真正说明原因)。

有没有其他方法可以摆脱这种重复/可能的不一致?即通过使用连接表中的数据让孩子知道其父级的一些方法吗?

3 个答案:

答案 0 :(得分:1)

如果有效,请尝试此操作。注意使用JoinColumn

   @OneToMany(cascade=CascadeType.ALL)
   @OrderColumn(name="child_order")
   public List<Child> getChildren() {
         return children;
   }

   @ManyToOne
   @JoinColumn("parent_id")
   public Parent getParent() {
       return parent;
   }

答案 1 :(得分:0)

  

与parent_id有重复 - 它在连接表和子表中指定,这意味着可以调用parent.getChildren()。get(0).getParent()并以不同于您的父级结束

开头

我不明白当一个孩子只有一个父母时,怎么可能。对于给定的父子元组,应该只有一个且只有一个记录int数据库,并且该子组永远不会存在于父子组的任何其他元组中。当然父母将在parent_child表中重复,但永远不会重复孩子。您是否在数据库表中指定了外键约束?在getParent()方法上使用mappedBy元素。

答案 2 :(得分:0)

我在Constraint violation in Hibernate unidirectional OneToMany mapping with JoinTable and OrderColumn when removing elements

中回答了类似的问题

请看看 我认为你对关联表的约束很糟糕,并且与List的原理不相容。