Pessoal,
Estou tentando deletar um fornecedor mas existe a tabela contas a pagar que tem uma FK (fornecedor_id), e por causa disso não consigo deletar. Aparece esse erro:
Pessoal,
Estou tentando deletar um fornecedor mas existe a tabela contas a pagar que tem uma FK (fornecedor_id), e por causa disso não consigo deletar. Aparece esse erro:
Ele está configurado para remover em cascata?
eu nem sei como fazer. Estou usando @ManyToOne
Bem… esse erro não costuma dar quando vc exclui não, e sim quando se altera ou se inclui algo no banco. Talvez pq, com a exclusão, o Hibernate esteja disparando um “flush automático” no sistema que está encontrando essa inconsistência.
Dê mais informações sobre o que vc está fazendo, trechos de código, etc… Isso facilita para agente te ajudar.
Sobre cascade, olhe a documentação do Hibernate: http://www.hibernate.org/hib_docs/reference/en/html_single/#example-parentchild
Espero ter ajudado. Até.
Estou tentando deletar o fornecedor dessa forma:
public ActionForward execute(ActionMapping map,ActionForm form,
HttpServletRequest req,HttpServletResponse res) throws Exception{
FornecedorForm fornecedorForm = (FornecedorForm) form;
Fornecedor fornecedor = fornecedorForm.getFornecedor();
ContaPagar contaPagar = new ContaPagar();
contaPagar.setFornecedor(fornecedor);
Session session = HibernateUtil.currentSession();
Transaction t = session.beginTransaction();
Dao<Fornecedor> dao = new Dao<Fornecedor>(session,Fornecedor.class);
dao.delete(fornecedor);
t.commit();
return map.findForward("ok");
}
mas ocorre esse erro:
Vamos lá…
Primeiro, pq vc seta o fornecedor dentro de um ContaPagar se vc não está usando esse ContaPagar pra nada? Tira isso do seu código! =]
Segundo, se eu não me engano, o Hibernate faz uma consulta do objeto antes de excluí-lo. Isso pode estar causando alguma inconsistência e por isso o erro. Tente consultar o objeto antes de mandá-lo para a exclusão. Algo como:
Session session = HibernateUtil.currentSession();
Transaction t = session.beginTransaction();
Fornecedor fornecedor = fornecedorForm.getFornecedor();
fornecedor = (Fornecedor)session.load(Fornecedor.class, fornecedor.getId());
try {
session.evict(fornecedor);
} catch(Exception e) {}
session.delete(fornecedor);
t.commit();
Não testei o código, mas acho q é isso! =)
Espero ter ajudado. Até.
Tentei mas não funfou 
Consegui!..faltou a anotação abaixo na classe Fornecedor:
@OneToMany
@JoinColumn(name="fornecedor_id")
private Set<ContaPagar> contaPagar;
só por curiosidade…o que o session.evict() faz?
Opa… o “evict” serve para retirar um objeto da sessão do Hibernate. O erro que você estava tomando acontece quando tenho duas instâncias distintas de uma mesma classe mas com o mesmo ID.
Provavelmente já havia uma instancia do Fornecedor com aquele ID na sessão. Quando vc mandava excluir, uma nova instância era criada com o mesmo ID e quando o Hibernate descobria que o objeto estava duplicado, lançava a exceção.
O que aquele código faz é pegar a referência do objeto que já estava na sessão, ao invés de criar outro, e mandá-lo para a exclusão. O “evict” nesse caso é só uma garantia de que, quando o objeto for excluído, não haja ninguém na sessão para acontecer o erro.
Nesse caso específico, acredito que o “evict” pode ser retirado do código que continuará funcionando.
Tomara que não tenha ficado complicado demais! =) Qualquer coisa, dê uma olhada na documentação do Hibernate.
Espero ter ajudado. Até.