Apagar registro de uma classe @ManytoMany

6 respostas
lemosmoises

Saudações a todos, Estou usando Hibernate 4 em um projeto eis a situação:

Tenho duas classes: Filme Genero
Relacionamento muitos para muitos (ManytoMany)

Gostaria de apagar um registro da classe Genero, mas surge o erro:
[color=red]cannot delete or update a parent row: a foreign key constraint fails[/color]

O erro é devido a classe Genero pertencer a algum registro do filme.
Por ex. quero apagar o registro AÇÃO(Genero) mas o (Filme)MAQUINA MORTIFERA está ?ligada? a ela.

Se eu colocar o @Cascade( value = CascadeType.Delete ) dentro da classe Genero ela apagará o Filme tbm. Coisa que eu não quero.

Gostaria de apagar somente o gênero e a outra tabela ?Filme_genero? que contem as chaves estrangeiras.
Alguém tem idéia se é possível fazer isso e como fazer?

Espero ter sido claro na exposição da pergunta.

6 Respostas

pmlm

Se não queres apagar os filmes todos de um género quando apagas o género (claro que isto não faria sentido), antes de apagar os género tens de modificar os filmes desse género para deixarem de pertencer ao mesmo.

Hebert_Coelho
Você tem que fazer algo do tipo

dog.getPerson().remove(person);

e depois entityManager.remove(person);
lemosmoises

O modo que achei para contornar a situação foi usar JDBC.

Primeiro apago a tabela "filme_genero" (por meio de SQL puro) que contem as chaves estrangeiras das classe Filme e Genero.

public void exclui( Genero genero ) {
		
		String sql = "delete from filme_genero where genero_id = ?";
		try
		{
			PreparedStatement statement = conexao.prepareStatement( sql );
			statement.setLong( 1, genero.getId() );
			
			statement.execute();
			statement.close();
		}
		catch( SQLException ex )
		{
			throw new RuntimeException( ex );
		}
		
	}
e por ultimo uso o hibernate para apagar o registo
session.delete( genero );
tx.commit();

Não é uma solução muito agradável mas ao menos funciona. Faz o que quero, apagar somente o registro "Genero" e não
aparece mais a mensagem.
[color=red]cannot delete or update a parent row: a foreign key constraint fails[/color]

lemosmoises
<blockquote><div class="quote-author">jakefrog:</div>Você tem que fazer algo do tipo

dog.getPerson().remove(person);

e depois entityManager.remove(person);</blockquote>

É prefiiiiiriiiiiivel ficar sem responder que enviar resposta inadequada, inútil, sem utilidade, indiferente, desleixada, boba e por fim fraca!
:?: :?: :?:

Hebert_Coelho
<blockquote><div class="quote-author">lemosmoises:</div><blockquote><div class="quote-author">jakefrog:</div>Você tem que fazer algo do tipo

dog.getPerson().remove(person);

e depois entityManager.remove(person);</blockquote>

É prefiiiiiriiiiiivel ficar sem responder que enviar resposta inadequada, inútil, sem utilidade, indiferente, desleixada, boba e por fim fraca!
:?: :?: :?: E pq vc acha que eu faria isso? Pq vc acha que minha resposta não foi adequada?

Hebert_Coelho

Enquanto aguardo sua resposta sobre a pergunta que fiz acima, achei bom te alertar de algo.

O delete como você está fazendo é desaconselhável em todos os livros que falam de JPA que eu já li.

Você pode ferrar seus dados no DB! :wink:

Criado 21 de junho de 2012
Ultima resposta 25 de jun. de 2012
Respostas 6
Participantes 3