【问题标题】:Many-to-many relationship with composite keys in HibernateHibernate中与复合键的多对多关系
【发布时间】:2013-02-08 15:32:08
【问题描述】:

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

我应该查看什么以及该映射的哪一部分不正确?提前致谢。

【问题讨论】:

    标签: java hibernate mapping composite-key


    【解决方案1】:

    您的连接表需要 4 列。 2个引用example_table的PK列,2个其他引用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   |
    |...             |                                        |...             | 
    +----------------+                                        +----------------+
    

    【讨论】:

    • 感谢您的回答。你能解释一下为什么我需要 4 列吗?然后,您示例中的 2nd 和 4th 将包含相同的值。 @JoinTable 是否应该与我为这个案例编写的几乎相同,还是完全错误?
    • 不,他们不会。左表中有一行 ID 为 [A, B],右表中有一行 ID 为 [C, D]。因此,为了能够引用这两行,您需要 A、B、C 和 D。如果您不重复同一列两次,您的连接表定义会很好。
    • 我明白你的意思,这张表实际上可能有效,但在我的情况下,确实有 [A,B] 和 [C,B] (好吧,我没有设计这些先决条件,只需要与他们合作)。所以即使这可行,我也会有重复的数据。您如何看待这种情况?
    • 除非您可以保证两个表中的所有行在 another_id 列中始终具有相同的值(在这种情况下完全不需要此列),否则您的连接表中将需要 4 列。