使用@JoinTable和多对多关系中的共享密钥的例外情况

时间:2014-05-26 08:26:54

标签: java hibernate jpa many-to-many jointable

我有一张代表多对多关系的表。

+----------+           +------------+           +----------+
|   User   |           | UserGroups |           |  Group   |
+----------+           +------------+           +----------+
| id   (PK)|---(1,N)---| user_id    |---(N,1)---| id   (PK)|
| year (PK)|           | year       |           | year (PK)|
| name     |           | group_id   |           | name     |
+----------+           +------------+           +----------+

在Java中,我只有实体User和Group,我不喜欢在Java模型中拥有UserGroups,因为它没有提供关系的更多信息。我的班级用户是这样的:

@Entity
@Table(name="User")
public class User {
  @EmbeddedId
  private UserPK id;
  @ManyToMany
  @JoinTable(name = "UserGroups",
             joinColumns = { @JoinColumn(name = "user_id", referencedColumnName="id"),
                             @JoinColumn(name = "year", referencedColumnName="year") },
             inverseJoinColumns = { @JoinColumn(name = "group_id", referencedColumnName = "id"),
                                    @JoinColumn(name = "year", referencedColumnName = "year") })
  private List<Group> groups;
}

当我尝试运行应用程序时,我得到了这个例外:

org.hibernate.MappingException:Repeated column in mapping for collection: com.testapp.model.entities.User.groups column: year

我不想在我的Java模型中拥有UserGroups。 我不想在UserGroups表中创建另一个年份列。 我如何在Java中实现这种关系?

1 个答案:

答案 0 :(得分:0)

我根本不是这个主题的专家。但我确实知道以下内容:

联接表只能通过其ID来关联/连接UserGroup个实体,因为它们是unique。在您添加字段year int等式时,您忽略该要求。

结论:您必须从联接表中删除年份。

选项:使其成为唯一的&#34; user_id&amp;一年&#34;对于用户表和&#34; group_id&amp;一年&#34;对于Group表可能有效。我对此表示怀疑。