[RESOLVIDO]ManyToMany com Hibernate

Olá pessoal,

To fazendo uma pesquisa aqui no fórum, mas num encontrei exatamente o que queria. Tenho o seguinte problema, fiz o mapeamento ManyToMany em JPA usando o Hibernate.
São tres tabelas: Aluno, aluno_turma, Turma.
Aluno | aluno_turma | Turma
id int pk | aluno_id fk | id int pk
nome varchar | turma_id fk | …

No mapeamento, fiz bidirecional, tudo normal. Quando salvo, salva normalmente o aluno e sua turma relacionada. Porém, quando salvo novamente o mesmo aluno, para outra turma, ele é deletado e reinserido para a nova turma. Ou seja, não posso colocar um aluno em 2 turmas diferentes.
No mapeamento, fiz assim:

Entidade Aluno:

@ManyToMany(fetch=FetchType.LAZY) @JoinTable(name="aluno_turma", joinColumns=@JoinColumn(name="aluno_id"), inverseJoinColumns=@JoinColumn(name="turma_id")) private Collection<Turma> turmas;

Entidade Turma:

@ManyToMany(fetch=FetchType.LAZY, mappedBy="turmas", targetEntity=Aluno.class ) private Collection<Aluno> alunos;

Bom gente, por eu ser iniciante ao extremo, não consegui entender o porque isso ocorre. O que eu queria seria poder salvar o mesmo aluno em diversas turmas.

Valeu gente

Tenho um exemplo de muitos-para-muitos que funciona e pode ser util:

Fazendo analogia ao seu caso:

Turma=Acao
Aluno=GrupoUsuario
aluno_turma=GrupoUsuarioAcao

Acao.java:

private Set grupos;
public Set getGrupos ()
{
return grupos;
}

public void setGrupos (Set grupos)
{
    this.grupos = grupos;
}

Acao.hbm.xml:

    <set name="grupos" table="seguranca.grupo_usuario_acao">
        <key column="acao_cd"/>
        <many-to-many column="grupo_cd" class="SiaproPadrao.modelo.GrupoUsuario"/>
    </set>

GrupoUsuario.java:

private Set acoes;
public Set getAcoes ()
{
return acoes;
}

public void setAcoes (Set acoes)
{
    this.acoes = acoes;
}

GrupoUsuario.hbm.xml:

    <set name="acoes" table="seguranca.grupo_usuario_acao">
        <key column="grupo_cd"/>
        <many-to-many column="acao_cd" class="SiaproPadrao.modelo.Acao"/>
    </set>

GrupoUsuarioAcao.java:

private GrupoUsuario grupo;
private Acao acao;

public GrupoUsuario getGrupo ()
{
    return grupo;
}

public void setGrupo (GrupoUsuario grupo)
{
    this.grupo = grupo;
}

public Acao getAcao ()
{
    return acao;
}

public void setAcao (Acao acao)
{
    this.acao = acao;
}

GrupoUsuarioAcao.hbm.xml:

    <!-- Grupo -->
    <many-to-one name="grupo"
                 column="grupo_cd"
                 not-null="true"/>
                 
    <!-- Acao -->
    <many-to-one name="acao"
                 column="acao_cd"
                 not-null="true"/>

Cara, se fez dessa forma como diz, está certo. O que significa que seu problema é outro. Procure ver como está salvando seus objetos, pois tenho certeza que é onde reside seu problema. Se for o caso, poste aqui pra analisarmos.

Abraços

Olá

Poderia você por gentileza mostrar o teu código que faz a inserção de aluno/turma?

Abraços

Pô djemacao, vc acertou em cheio. Era eu fazendo o que num deve (leia-se cagada).
Eu tava adicionando um new Array no código antes de adicioná-lo a Set e deixei assim:

[code] aluno.getTurmas().add(turma);

    turma.getTurmas().add(aluno);

[/code]

Outro erro meu era usar Collection ao invés de Set, onde ele num verificava se o aluno havia sido adicionado a turma já e vice-versa. Bom, é isso.
Vou deixar a referência onde encontrei as soluções:

http://www.hibernate.org/109.html
http://forum.hibernate.org/viewtopic.php?p=2328598&sid=7f15077e9943bab798d0c1591bee858f

E agradecer ao autor Edson Gonçalves por ter me passado estas informações.

Valeu gente, se precisarem de mais detalhes, me avisem.

Já imaginava que o problema era fácil. Coloque resolvido no Assunto para que outros possam saber pelas pesquisas.

Abraços

Desculpa a demora em colocar [Resolvido].

Valeu djemacao pela dica.