Deletar em cascata no hibernate 3

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 :frowning:

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é.