2013-02-08 95 views
1

有沒有辦法使用@JoinTable註釋,每個表連接兩個字段?下面是該示例表:在休眠中與複合鍵的多對多關係

+----------------+ +----------------------------------+ +----------------+  
| example_table | | example_table_to_some_type_table | | some_type_table| 
+----------------+ +----------------------------------+ +----------------+ 
|example_table_id| |example_table_id     | |some_type_id | 
|another_id  | |some_type_id      | |another_id  | 
|...    | |another_id      | |...    | 
|other columns | +----------------------------------+ |other columns | 
|...    |          |...    | 
+----------------+          +----------------+ 

對於許多到一個情況下,它看起來像:

@ManyToOne 
@JoinColumns({ @JoinColumn(name = "some_type_id", 
    referencedColumnName = "some_type_id", 
    insertable = false, updatable = false), 
       @JoinColumn(name = "another_id", 
    referencedColumnName = "another_id", 
    insertable = false, updatable = false) }) 
private SomeType someType; 

但對於許多一對多的關係?我嘗試以下,並沒有奏效:

@ManyToMany(targetEntity = SomeType.class) 
@JoinTable(name = "example_table_to_some_type_table", 
    joinColumns = { @JoinColumn(name = "example_table_id"), 
        @JoinColumn(name = "another_id") }, 
    inverseJoinColumns = { 
        @JoinColumn(name = "some_type_id"), 
        @JoinColumn(name = "another_id") }) 
private Set<SomeType> someTypeSet; 

我得到了以下錯誤:

Repeated column in mapping for collection: com.package.name.Example.someTypeSet column: another_id 

我應該看什麼,在與此映射的一部分是不正確的?提前致謝。

回答

2

您的連接表需要4列。 2參考example_table和2其他2列的PK列以參考some_type_table的PK列。

所以它應該看起來像

+----------------+ +----------------------------------+ +----------------+  
| example_table | | example_table_to_some_type_table | | some_type_table| 
+----------------+ +----------------------------------+ +----------------+ 
|example_table_id| |example_table_id     | |some_type_id | 
|another_id  | |example_table_another_id   | |another_id  | 
|...    | |some_type_id      | |...    | 
|    | |some_type_table_another_id  | |    | 
|other columns | +----------------------------------+ |other columns | 
|...    |          |...    | 
+----------------+          +----------------+ 
+0

感謝您的回答。你能解釋爲什麼我需要4列嗎?然後,您的示例中的第二個和第四個將包含相同的值。 @JoinTable看起來應該和我爲這個案例寫的一樣,還是完全錯誤? – 2013-02-08 19:15:42

+0

不,他們不會。左側表中有一行ID爲[A,B],右側表中有一行ID爲[C,D]。所以,爲了能夠引用這兩行,你需要A,B,C和D.如果你不重複同一列兩次,你的連接表定義將會很好。 – 2013-02-08 19:19:23

+0

我明白了你的觀點,這張表實際上可能有效,但在我的情況下確實有[A,B]和[C,B](當然,我沒有設計這些先決條件,只需要與他們合作)。所以,即使這樣做,我會重複數據。你對這種情況一般有什麼看法? – 2013-02-08 19:24:16