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!
JMARQ
Março 1, 2013, 11:07am
#2
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.