在休眠中与复合键的多对多关系
问题描述:
有没有办法使用@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 |
|... | |... |
+----------------+ +----------------+
感谢您的回答。你能解释为什么我需要4列吗?然后,您的示例中的第二个和第四个将包含相同的值。 @JoinTable看起来应该和我为这个案例写的一样,还是完全错误? – 2013-02-08 19:15:42
不,他们不会。左侧表中有一行ID为[A,B],右侧表中有一行ID为[C,D]。所以,为了能够引用这两行,你需要A,B,C和D.如果你不重复同一列两次,你的连接表定义将会很好。 – 2013-02-08 19:19:23
我明白了你的观点,这张表实际上可能有效,但在我的情况下确实有[A,B]和[C,B](当然,我没有设计这些先决条件,只需要与他们合作)。所以,即使这样做,我会重复数据。你对这种情况一般有什么看法? – 2013-02-08 19:24:16