2010-12-10 54 views
2

我使用聯接表具有OneToMany/ManyToOne雙向關係。孩子們在一個名單,並訂購。使用JoinTable(使用OrderColumn)消除OneToMany/ManyToOne雙向關係中的重複問題

這裏的設置:

家長:

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

兒童:

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

這裏是我的問題:是否如預期的父表,但這裏是孩子和parent_child表:

孩子:

int8 id, 
int8 parent_id <--- 

parent_child:

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

有重複與PARENT_ID - 它在連接表和子表,這意味着它可以調用parent.getChildren()得到(0).getParent規定。 ()並最終得到一個不同於你開始的父類,這應該是不可能的(我希望在數據庫級別執行該操作)。

我能看到解決這個問題的唯一方法是在孩子中使用連接列,而不是使用連接表。但我不喜歡這樣做,因爲那時我必須將訂單移動到孩子,再加上hibernate文檔說應該避免使用OneToMany的JoinColumn(但他們沒有真正說出原因)。

是否有任何其他方式擺脫這種重複/可能的不一致?即通過使用連接表中的數據讓孩子知道其父母的一些方法?

回答

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; 
    } 
0

有重複與PARENT_ID - 它在連接表和子表,這意味着它可以調用parent.getChildren(指定).get(0).getParent()並最終以不同於你開始的父親

我不明白怎麼可能,當一個孩子可以只有一位家長。對於給定的父子元組,應該只有一個記錄int數據庫,並且該子元素將永遠不會存在於父子元素的任何其他元組中。當然,父母將在parent_child表中重複,但從不會重複孩子。你有沒有在數據庫表上指定外鍵約束?使用getParent()方法的mappedBy元素。