JPA @OneToMany Наборы и уникальные contstaints - PullRequest
0 голосов
/ 30 марта 2009

У меня есть следующий сценарий:

У меня полно пользователей. Есть желание проводить конкурсы для пользователей, которые заходят на сайт около недели или около того. Поэтому мне нужно было создать новый объект 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.

1 Ответ

2 голосов
/ 30 марта 2009

У вас действительно есть отношения многие ко многим. Поэтому вы должны использовать аннотацию @ManyToMany.

...