Problemas com hibernate - Cascade

Olá amigos,

Estou enfrentando um problema com o framework hibernate 3 com annotations. O que ocorre é que eu tenho uma classe Lancamento, esta classe possui uma lista de despesas (um para muitos). Como o relacionamento é de composição, quando eu deleto o lançamento, o comportamento que eu espero é que todas as despesas relacionadas a este lançamento sejam removidas, mas não é bem isto que ocorre. Quando tento fazer a remoção o sistema retorna a seguinte mensagem:

Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (gsw_despesa, CONSTRAINT FK7A329AE1FCCB8C58 FOREIGN KEY (id_lancamento) REFERENCES gsw_lancamento (id_lancamento))

Verifiquei no banco de dados que o ondelete da tabela não está como Cascade, e se caso eu altere para cascade na mão tudo funciona normalmente.

Estou postando o código da classe abaixo:

package com.gisaweb.admin.domain.lancamento;

import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import com.gisaweb.admin.domain.Operacao;
import com.gisaweb.admin.domain.UsoTerra;

@Entity
@Table(name="gsw_lancamento")
public class Lancamento {
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name="id_lancamento")
	private Integer id;
	
	@Temporal(TemporalType.DATE)
	private Date dataLancamento;
	
	private String documento;
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="id_usoTerra")
	@Fetch(FetchMode.JOIN)
	private UsoTerra usoTerra;
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="id_operacao")
	@Fetch(FetchMode.JOIN)
	private Operacao operacao;
	
	@OneToMany(mappedBy="lancamento" , fetch=FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private List<Despesa> listaDespesas;
	
	private int status;

	public Date getDataLancamento() {
		return dataLancamento;
	}

	public void setDataLancamento(Date dataLancamento) {
		this.dataLancamento = dataLancamento;
	}

	public String getDocumento() {
		return documento;
	}

	public void setDocumento(String documento) {
		this.documento = documento;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public List<Despesa> getListaDespesas() {
		return listaDespesas;
	}

	public void setListaDespesas(List<Despesa> listaDespesas) {
		this.listaDespesas = listaDespesas;
	}

	public Operacao getOperacao() {
		return operacao;
	}

	public void setOperacao(Operacao operacao) {
		this.operacao = operacao;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	public UsoTerra getUsoTerra() {
		return usoTerra;
	}

	public void setUsoTerra(UsoTerra usoTerra) {
		this.usoTerra = usoTerra;
	}
	
}

Alguém tem uma idéia? O que estou fazendo de errado?

To com o mesmo problema…

Na lista de despesas coloca a seguinte annotation.

@OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER)E lembrando que se o banco for MySql as tabelas tem q ser do tipo InnoDB, se for outro tipo não vai funcionar…

Ops corrigindo na classe Pai fica assim.

@OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER, mappedBy = "pessoaBean") public List<PessoaFisicaBean> getListPessoaFisica() {} E na classe Filha assim

@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) @JoinColumn(name = "id_pessoa", referencedColumnName = "id_pessoa") public PessoaBean getPessoaBean() {} Eu prefiro colocar as annotations nos métodos get.

Não deu certo aqui…

@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) @JoinColumn(name = "Permissao_Cod") @org.hibernate.annotations.OnDelete(action = org.hibernate.annotations.OnDeleteAction.CASCADE) private Permissao Permissao;

@OneToMany(mappedBy="Permissao",cascade = CascadeType.REMOVE, fetch = FetchType.EAGER) private Set<Funcionario> funcionarios = new TreeSet<Funcionario>();