2009-03-30 7 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; 

그러나 일단 컨테스트가 끝나면 다른 컨테스트를 실행하는 것이 좋습니다. 새로운 컨테스트를 만들고 이전에 입력 한 사용자 중 한 명이 다시 입력하게하려고하면 고유 한 키 제약이 생깁니다. 테이블 DDL을 보면, 그것이 의미가 있습니다.

그래서 본질적으로 두 가지 경연 대회를 동시에 진행할 수 없습니다. 나는 또한 대회에 참가하는 사람들의 역사를 잃을 것이다. 그게 효과가 없을거야. 서로 다른 컨테스트에서 동일한 사용자와 한 번에 두 가지 컨테스트를 운영 할 수 있어야합니다.

저는 JPA를 처음 사용 했으므로 뭔가 확실한 것이 빠져 있다고 생각합니다. 시스템에 이미 사용자 테이블이 있으며 사용자로 가득 차 있습니다. 테이블 구조를 변경하지 않으려는 욕망이 있습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 중요하다면, 지속성 구현은 Hibernate이다.

답변

2

실제로는 다 대다 관계입니다. @ManyToMany 주석을 사용해야합니다.

+0

@ManyToMany로 업데이트하면 생성 된 DDL에 차이가 없음을 알았습니다! 그러나 그것이 효과가 있는지보기 위해 노력할 것입니다. –

+0

나는 그것이 다르게 무엇을했는지 알지 못한다. 감사합니다. –