Pergunta

Eu tenho o seguinte cenário:

Eu tenho um sistema completo de usuários. Há um desejo de executar concursos para usuários que entrar no site mais de uma semana ou assim. Por isso que eu precisava para criar um novo objeto Concurso que contenham ambas as entradas e os vencedores.

Eu criei algo como isto:

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;
}

A idéia é que um concurso pode ter várias entradas. Parece simples. Ele gera o seguinte:

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;

No entanto, uma vez que um concurso é longo, o desejo é o de executar uma outra competição. Quando tento criar um novo concurso e ter um dos usuários que tinham entrado previamente entrar novamente, eu recebo uma restrição de chave única. Olhando para o DDL mesa, faz sentido que ele faz.

Então, em essência, não posso correr duas competições ao mesmo tempo. Eu também perderia a história de pessoas que entram os concursos. Isso não vai funcionar. Eu preciso ser capaz de executar duas competições ao mesmo tempo com os mesmos usuários em diferentes concursos.

Eu sou novo para JPA, então eu tenho que acreditar que eu estou faltando alguma coisa óbvia. O sistema já possui uma tabela de usuário e é povoada cheio de usuários. Há um desejo de não mudar essa estrutura da tabela. Todas as ideias sobre como resolver isso? Se é importante, a implementação persistência é Hibernate.

Foi útil?

Solução

Você realmente tem um relacionamento muitos-para-muitos. Portanto, você deve usar a anotação @ManyToMany.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top