2013-03-13 88 views
2

我有一個非常基本的多對多的關係:人與項目,設置如下:如何設置與JPA/Hibernate的基本manytomany關係?

人:

@ManyToMany(cascade=CascadeType.ALL) 
@JoinTable(name = "person_project", 
joinColumns = @JoinColumn(name = "Person_Id"), 
inverseJoinColumns = @JoinColumn(name = "Project_id")) 
private Set<Project> projects = new HashSet<Project>(); 

項目:

@ManyToMany 
@JoinTable(name = "person_project", 
joinColumns = @JoinColumn(name = "Project_Id"), 
inverseJoinColumns = @JoinColumn(name = "Person_id")) 
private Set<Person> persons = new HashSet<Person>(); 

當更新的人,新項目可能會被指定。我有一個爲Person設置的JPARepository,我使用saveAndFlush(...)來將可能的新項目保存到Person中。

這適用於一個人。如果我添加一個新的項目,它將與Person一起保存並且數據庫中的表正確更新。但是,如果我然後爲另一個人添加相同的項目 - 它將從第一個人中刪除!第一個人的id被替換爲連接表中第二個人的id。

這是什麼原因造成的?我的關係設置不正確?

回答

3

您不在映射的兩半上使用相同的註釋。第一部分定義了連接表和列。映射的後半部分只需要知道另一半的名稱(您的案例中的項目),它將從第一個註釋中獲取詳細信息。對於一個體面的解釋,請參閱:Hibernate Many to Many Mapping

+0

有趣。我從Pro Spring 3 Book的例子中得到了這樣一個想法:它的確是這樣做的:兩邊只有交換的列相同的映射。我在網上找不到類似的例子,但我確實發現了幾個頁面提到雙向關係需要「mappedBy」,而單向關係在反面沒有註釋。我仍然有些困惑。 – wannabeartist 2013-03-13 19:02:36

0

看起來改變項目如下解決了這個問題:

@ManyToMany(mappedBy="projects") 
private Set<Person> persons = new HashSet<Person>(); 

現在,當我添加了同一項目的第二個人,第一個將保持與這一項目,因爲它應該。

我仍然不知道爲什麼這個作品,所以如果有人可以解釋它,請做!

+0

你知道這個問題嗎?你可以解釋嗎? – 2013-07-20 08:34:59

+0

不,我沒有比@WPrecht的答案中給出的更好的解釋 – wannabeartist 2013-07-20 20:26:50