我使用连接表有一个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(但他们并没有真正说明原因)。
有没有其他方法可以摆脱这种重复/可能的不一致?即通过使用连接表中的数据让孩子知道其父级的一些方法吗?
答案 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)
请看看 我认为你对关联表的约束很糟糕,并且与List的原理不相容。