Problema na Criação de Classes N pra N usando JPA

Olá pessoal!

Estou tento problemas na criação de classes N pra N,

Alguém tem alguma dica pra me ajudar a criar ou algum exemplo, tutorial, apostila que dê certo.

Ficaria muito grato.

Abraços,

em um relacionamento entre empresa e consultor, e uma tabela consultor_empresa de junção, many to many, por exemplo:

na classe consultor, relativo a coleção de empresas:

@ManyToMany(cascade=CascadeType.MERGE, targetEntity=Empresa.class) @JoinTable( name="consultor_empresa" , joinColumns={ @JoinColumn(name="ID_CONSULTOR", nullable=false) } , inverseJoinColumns={ @JoinColumn(name="ID_EMPRESA", nullable=false) } ) @Fetch(FetchMode.JOIN) public Set<Empresa> getEmpresas() { return this.empresas; }

ja na classe Empresa, o contrário:

@ManyToMany(cascade=CascadeType.MERGE, targetEntity=Consultor.class) @JoinTable( name="consultor_empresa" , joinColumns={ @JoinColumn(name="ID_EMPRESA", nullable=false) } , inverseJoinColumns={ @JoinColumn(name="ID_CONSULTOR", nullable=false) } ) public Set<Consultor> getConsultors() { return this.consultors; }

detalhe que a maioria dos materiais por ai dizem para você usar a anotação joinTable apenas em um dos lados e no outro usar o mappedBy no manyToMany… isso nos meus testes não funcionou totalmente, supondo neste exemplo que você usou Consultor como principal com a anotação joinTable e empresa referenciando o atributo empresas, quando você pega a lista de empresas e altera em consultor, isso era refletido no banco mas ao alterar a lista de consultores em empresa não (por isso usei o joinTable em ambos e passou a funcionar de ambos os lados). Não sei se isso deve ser considerado um bug ou não, estou usando o Hibernate 3 (3.2 se bem me lembro para ser exato), JPA 1.

Amigo e qdo vc tem mais atributo dentro da terceira classe…tipow…no meu caso…Aluno e Turma…e tenho a Tabela Turma_Aluno (q além das duas ID´s(tur_codigo e alu_codigo) tem turma_inicio, turma_fim, turma_valor) como ficaria, pois peguei exemplos e foram mais confusos do que explicativos…

repare que são apenas 2 classes, o que você tem três são tabelas (a tabela de junção não precisa ser uma classe).

Acredito que você precisa desse inicio e fim na classe e tabela turma também (somente como exemplo, se fosse alunos e turma seria 1 turma para n alunos o correto). Além disso, repare que os parâmetros joinColluns e inverseJoinColluns são arrays, portanto você pode colocar mais de um anotação @JoinCollumn dentro de ambos, portanto na classe Turma, no joinCollumns você colocaria mais uma anotação JoinCollumn para inicio e outra para final, enquanto que na aluno você faria o mesmo porém em inverseJoinCollumns. Alguma cois ado tipo:

@ManyToMany(cascade=CascadeType.MERGE, targetEntity=Aluno.class) @JoinTable( name="turma_aluno" , joinColumns={ @JoinColumn(name="id_turma", nullable=false) @JoinColumn(name="inicio", nullable=false) @JoinColumn(name="final", nullable=false) } , inverseJoinColumns={ @JoinColumn(name="id_aluno", nullable=false) } ) @Fetch(FetchMode.JOIN) public Set<Aluno> getAlunos() { return this.alunos; }

e

@ManyToMany(cascade=CascadeType.MERGE, targetEntity=Turma.class) @JoinTable( name="turma_aluno" , joinColumns={ @JoinColumn(name="id_aluno", nullable=false) } , inverseJoinColumns={ @JoinColumn(name="id_turma", nullable=false) @JoinColumn(name="inicio", nullable=false) @JoinColumn(name="final", nullable=false) } ) @Fetch(FetchMode.JOIN) public Set<Aluno> getAlunos() { return this.alunos; }

Como disse, eu acredito que seja assim, não tenho certeza pro que nunca precisei fazer então se você está precisando disso recomendo testar (e vir aqui responder se deu certo que só pergunta não vale…rs).

Vou seguir isso q vc postou mas tenho q saber…um aluno pode pertencer a várias turmas E vários alunos podem pertencer a uma turma a montagem seria essa msm?

bom isso quem decide é vocês ai, depende da regra de negócio do sistema que estão fazendo…

por exemplo: se for em uma escola de cursos técnicos, um mesmo aluno por estar em duas turmas, uma de manhã em um curso e outra de tarde em um outro curso por exemplo, e uma turma teóricamente tem mais de um aluno, então seria N x N… se for para uma escola mesmo, de ensino fundamental por exemplo (acho que nem é este mais o nome), ai um aluno dificilmente vai estar na quinta série e na sexta ao mesmo tempo…

é isso msm, é um Studio Pilates onde um msm aluno pode estar em várias turmas e uma turma tem vários alunos…