Remoção em Cascata - OneToMany and ManyToOne

7 respostas
V

Pessoal, não estou conseguindo remover os objetos filhos. Já testei várias soluções e até agora nada. O problema é que na hora em que tento apagar um produto ele não remove os reviews, caso o produto tenha. Erro: Cannot delete or update a parent row: a foreign key constraint fails (`review_produtos`.`review`, CONSTRAINT `FK91B3E3789EB6334D` FOREIGN KEY (`prod_id`) REFERENCES `produto` (`prod_id`)).

Produto.java

@Entity
public class Produto {



	@Id	
	@Column(name = "prod_id")
	private int id;
	@Column(name = "prod_cod")
	private String codigo;
	@Column (name = "prod_nome")
	private String nome;
	
	
	
	@ManyToOne
	@JoinColumn (name = "usu_id")
	private Usuario usuario;
	
	@OneToMany(mappedBy = "produto", cascade = CascadeType.ALL)
	private Collection<Review> listaReviewProduto;

}

Review.java

@Entity
public class Review {
	
	@Id	
	@Column(name = "rev_id")
	private int id;
	
	@Column(name = "rev_desc")
	private String descricao;
	
	
	@ManyToOne
	@JoinColumn(name = "usu_id")
	private Usuario usuario;
	
	@ManyToOne
	@JoinColumn(name = "prod_id")
	private Produto produto;
   
}

ProdutoController.java

@Restrito
@Delete("/produto/{produto.id}")
public void remover(Produto produto){
		
     produto = this.produtoDAO.remove(produto);
     result.redirectTo(this).listar();
		
		
}

ProdutoDAO.java

public Produto remove(Produto produto) {

	Transaction tx = this.session.beginTransaction();
	this.session.delete(produto);
	tx.commit();

	return produto;

}

Alguém poderia me ajudar?

valeu!

7 Respostas

JMARQ

Veja esse link: http://www.guj.com.br/java/43924-cascade-no-hibernate—ajuda
Serviu para a removação dos objetos filhos do meu projeto com Hibernate.

Até mais.

edu_fernandes

Bom dia Vinustux.

Você tentou utilizar o CascadeType.Remove no lugar do CascadeType.All ?

Outro ponto é que o problema pode ser em sua base de dados.

Verifique se as tabelas possuem o mesmo Schema e se existe outra tabela que tenha referência de review e/ou produto como FK.
O dicionario do InnoDB pode estar fora de sincronia.

São possíveis soluções estas.

De qualquer forma, espero que possa ter ajudado, caso contrario vamos continuar tentando.

Hebert_Coelho

Esse post explica como usar o Cascade ou orphan removal.

Leia também sobre o relacionamento.

V

Desde já agradeço a ajuda de vocês. Fiz dessa forma e funcionou só não sei se é correta: Fui na tabele review na aba foreing keys(uso Navicat), na aba On Delete e On Update estavam como RESTRICT, logo mudei para CASCATE, e funcionou. Para testar eu cadastrei um produto, depois cadastrei um review e depois cadastrei um comentário desse review, logo em seguida apaguei produto ele apagou os filhos. O problema é quando eu fui apagar direto na tabela review ele deu erro.

V

Alguém poderia me esclarecer? vlw

javaflex

Posta o erro pro pessoal saber.

V

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.hibernate.exception.ConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`review_produtos`.`review`, CONSTRAINT `review_ibfk_11` FOREIGN KEY (`prod_id`) REFERENCES `produto` (`prod_id`)) br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93) br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44) br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91) br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58) br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)

Esse é o erro.

Criado 1 de março de 2013
Ultima resposta 3 de mar. de 2013
Respostas 7
Participantes 5