Java Hibernate中复合键的多对多关系

Java Hibernate中复合键的多对多关系,java,hibernate,mapping,composite-key,Java,Hibernate,Mapping,Composite Key,有没有办法使用@JoinTable注释,通过两个字段连接每个表?以下是示例表: +----------------+ +----------------------------------+ +----------------+ | example_table | | example_table_to_some_type_table | | some_type_table| +----------------+ +-----------------------------

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

我应该看什么?这个映射的哪一部分是不正确的?提前感谢。

您的联接表需要4列。2参考
示例表
的主键列,2参考
某些类型表
的主键列

所以看起来应该是这样的

+----------------+  +----------------------------------+  +----------------+      
| 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   |
|...             |                                        |...             | 
+----------------+                                        +----------------+

谢谢你的回答。你能解释一下为什么我需要4列吗?示例中的第二个和第四个将包含相同的值。那么@JoinTable应该看起来和我为这个案例写的差不多还是完全错了?不,他们不会。左表中有一行ID为[a,B],右表中有一行ID为[C,D]。因此,为了能够引用这两行,您需要A、B、C和D。如果不重复同一列两次,您的联接表定义就可以了。我明白您的观点,这个表实际上可能会工作,但在我的例子中,确实有[A、B]和[C、B](嗯,我没有设计这些先决条件,只需要使用它们)。因此,即使这样做有效,我也会复制数据。您通常对这种情况怎么看?除非您能保证两个表中的所有行在另一个_id列中总是具有相同的值(在这种情况下,该列完全不需要),否则您的联接表中需要4列。
+----------------+  +----------------------------------+  +----------------+      
| 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   |
|...             |                                        |...             | 
+----------------+                                        +----------------+