Hibernate - Mapeamento Many-to-Many

Olá Pessoa, tudo bem? Espero que sim!

Eu estou com o seguinte problema: tenho um mapemaneo many-to many entre Filme e Pessoa, que gera a relação associativa Direcao que tem como chave-primeira a composição das chaves estrangeiras idFilme e idPessoa.

O mapeamento funcionou perfeitamente, o Hibernate executou os comandos DDL com exatidão, todas as restrições estão adequadas.

No entanto, quando executo o comando this.session.delete( filme ) ocorre um erro: o framework não exclui os dados da relação Direcao (relação associativa) e parte direto para a exclusão do filme causando um erro de quebra de restrição, e quando coloco o atributo cascade=“delete-orphan” ou cascade=“delete” ou cascade=“all-delete-orphan” ele primeiro executa a atualização de outro relacionamento um para muitos que o filme possui com elenco, que está relacionado com pessoa, atribuindo o valor null para o idPessoa do elenco: UPDATE Elenco set idPessoa=null WHERE idPessoa=?. O que também gera um erro.

Só para deixar claro o meu contexto:

Pessoa possui um relacionamento 1:N com Elenco.
Filme possui um relacionamento 1:N com Elenco.
Filme possui um relacionamento N:M com Pessoa (gerando a relação associativa Direcao)

Direcao = { idFilme, idPessoa }
Elenco = { idFilme, idPessoa, nomeDoPersonagem }

Se alguém puder me ajudar com isso seria muito grato. Só para deixar claro os mapeamentos estão funcionando, só ocorre erro quando excluo um filme. Porém, acredito que deve estar faltando algum atributo no mapeamento.

Obrigado pela atenção.

lucasvenez

Mesmo tendo relacionamentos ManyToMany no meu projeto nunca tive essa necessidade, por enquanto, e fiquei interessado.

A única opção que me passou pela mente no momento é fazer na mão:

Levantar todas as pessoas que tem um relacionamento com o filme. Com esses dados ir de pessoa em pessoa e retirar o relacionamento com o filme.

Após isso poderia deletar o filme.

Outra opção seria usar dois relacionamentos onetomany.

Provavelmente seja obvio e já tenha pensado nisso. Vou tentar pesquisar o assunto.

Achei estas “soluções”:

https://forums.hibernate.org/viewtopic.php?f=1&t=17 (se você usar java.util.Set)

http://stackoverflow.com/questions/1299455/hibernate-manytomany-delete-relation-problem (parece interessante)

http://www.guj.com.br/posts/list/67454.java

Você pode mostrar como implementou o relacionamento?

E ai Lagaffe, tudo bem? Espero que sim!

Obrigado pela atenção.

Pois bem, o meu mapeamento foi feito da segunte maneira:

Pessoa.hbm.xml

[color=blue]

          ...
          <set name="elenco" cascade="save-update">
                        <key column="idPessoa" on-delete="cascade"/>
                        <one-to-many class="Elenco"/>
          </set>

          <set name="direcao" table="Direcao">
                        <key column="idPessoa"/>
                        <many-to-many class="Filme" column="idFilme"/>
          </set>

[/color]

Filme.hbm.xml

[color=blue]

          ...
          <set name="elenco" cascade="save-update">
                        <key column="idFilme" on-delete="cascade"/>
                        <one-to-many class="Elenco"/>
          </set>

          <set name="direcao" table="Direcao">
                        <key column="idFilme"/>
                        <many-to-many class="Pessoa" column="idPessoa"/>
          </set>

[/color]

Então, como você já falou, alterar esse mapeamento para one-to-many resolve o problema, e foi exatamente o que fiz ontem depois que não aguentava mais ler e me valer do método impírico para tentar uma solução com many-to-many.

Mas ainda não estou satisfeito com a solução, acredito que o framework deve ter algum recurso para ser utilizado com mapeamento com essa cardinalidade.

O que mais me deixa intrigado é que o hibernate executa um update (da maneira que descrevi no primeiro item) atualizando elenco atribuindo null ao idPessoa, e o pior que isso é causado somente quando coloco o valor ( delete | delete-orphan | all-delete-orphan | all ) no cascade do mapeamento many-to-many - isso está fazendo com que quando se exclua um filme também se exclua as pessoas relacionadas com ele ao invés de excluir o relacionemento entre esses dois (o elenco do filme).

Eu também tentei excluir pessoa por pessoa, mas não obtive sucesso também.

Bom, tomara que consigamos encontrar alguma solução.

Até mais.