2009-03-30 3 views
0

У меня следующий сценарий:JPA @OneToMany Комплекты и уникальные препятствия

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

ответ

2

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

+0

Когда я обновился до @ManyToMany, я не видел разницы в создавшемся DDL! но я попробую посмотреть, работает ли он. –

+0

Я не знаю, что он сделал по-другому, но должно было быть добавлено еще одно ограничение, поскольку оно сработало. Спасибо –