在休眠中与复合键的多对多关系

问题描述:

有没有办法使用@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 

我应该看什么,在与此映射的一部分是不正确的?提前致谢。

您的连接表需要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