我有以下情况:
我有一个充满了用户的系统。希望为在一周左右登录该站点的用户进行竞赛。因此,我需要创建一个新的Contest对象,其中包含条目和获胜者。
我创造了这样的东西:
private Set<User>;
@OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
@JoinTable(name="contest_entries",
joinColumns = {@JoinColumn(name = "contest_fk", referencedColumnName="contest_id")},
inverseJoinColumns = {@JoinColumn(name = "user_fk", referencedColumnName="id")})
public Set<User> getEntries() {
return entries;
}
竞赛可以有多个参赛作品。看似简单。它生成以下内容:
create table contest (contest_id numeric(19,0) identity not null, primary key (contest_id));
create table contest_entries (contest_fk numeric(19,0) not null, user_fk numeric(19,0) not null, primary key (contest_fk, user_fk));
alter table contest_entries add constraint FK7FBD0C65C4F120C2 foreign key (contest_fk) references contest;
alter table contest_entries add constraint FK7FBD0C656ABC75E3 foreign key (user_fk) references user_profile;
然而,一旦比赛结束,希望再举办一场比赛。当我尝试创建一个新的比赛并让之前输入的用户之一再次输入时,我得到一个唯一的键约束。看看表DDL,它确实有意义。
所以,实质上,我不能同时进行两场比赛。我也会失去参加比赛的人的历史。那不行。我需要能够在不同的比赛中与同一用户同时进行两场比赛。
我是JPA的新手,所以我不得不相信我错过了一些明显的东西。系统已经有一个用户表,并且其中包含了大量用户。不希望改变该表结构。关于如何解决这个问题的任何想法?如果重要,持久性实现就是Hibernate。
答案 0 :(得分:2)
你实际上有多对多的关系。所以你应该使用@ManyToMany注释。