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?