Remoção em Cascata - OneToMany and ManyToOne

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

[code]@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;

}[/code]

Review.java

[code]@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;

}[/code]

ProdutoController.java

[code]@Restrito
@Delete("/produto/{produto.id}")
public void remover(Produto produto){

 produto = this.produtoDAO.remove(produto);
 result.redirectTo(this).listar();

}[/code]

ProdutoDAO.java

[code]public Produto remove(Produto produto) {

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

return produto;

}[/code]

Alguém poderia me ajudar?

valeu!

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.

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.

Esse post explica como usar o Cascade ou orphan removal.

Leia também sobre o relacionamento.

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.

Alguém poderia me esclarecer? vlw

Posta o erro pro pessoal saber.

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.