【问题标题】:JPA @OneToMany Sets and unique contstaintsJPA @OneToMany 集合和独特的约束
【发布时间】:2009-03-30 13:39:56
【问题描述】:

我有以下场景:

我有一个充满用户的系统。希望为超过一周左右登录该网站的用户举办竞赛。因此,我需要创建一个新的 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。

【问题讨论】:

    标签: java jpa join foreign-keys unique-constraint


    【解决方案1】:

    你实际上有一个多对多的关系。所以你应该使用@ManyToMany注解。

    【讨论】:

    • 当我更新到@ManyToMany 时,我发现创建的 DDL 没有任何区别!但我会试试看它是否有效。
    • 我不知道它有什么不同,但是在它起作用时肯定少了一个约束。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2021-05-09
    • 1970-01-01
    • 2013-05-23
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多