2009-03-30 18 views
0

私は次のシナリオを持っています:JPA @OneToManyセットとユニークなcontstaints

私はシステムがたくさんあります。 1週間ほどでサイトにログインするユーザーのためにコンテストを開催したいという要望があります。したがって、私はエントリと受賞者の両方を含む新しい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; 

しかし、いったんコンテストが終了すると、別のコンテストを実行することが欲しい。新しいコンテストを作成して、以前に入力したユーザーの1人に再度入力すると、固有のキー制約が発生します。テーブルDDLを見ると、それは意味があります。

本質的に、私は同時に2つのコンテストを行うことはできません。私はまた、コンテストに参加する人々の歴史を失うだろう。それはうまくいかないでしょう。私は、異なるコンテストで同じユーザーと同時に2つのコンテストを行うことができる必要があります。

私はJPAを使い慣れていないので、私は何かが分かりにくいと思っています。システムには既にユーザーテーブルがあり、ユーザーがいっぱいです。そのテーブル構造を変更したくないという希望があります。どのようにこれを解決するための任意のアイデアですか?重要であれば、持続性実装はHibernateです。

答えて

2

実際には、多対多の関係になっています。ですから@ManyToManyアノテーションを使うべきです。

+0

@ManyToManyに更新したとき、私は作成されたDDLに違いがないことを見た!私はそれが動作するかどうかを確認しようとします。 –

+0

私はそれが何をどういうことをしたのか分かりませんが、それが働くにつれて制約が少なくて済むはずです。 ありがとう –