Deletar em cascata - JPA/Hibernate

2 respostas
T

Gostaria de saber se existe alguma annotation que faça a deleção em cascata no Hibernate ? Segue abaixo exemplo:

1° - Pojo

@Entity
public class Pojo1{

    @OneToMany(fetch = FetchType.LAZY, mappedBy= "pojo1",cascade = CascadeType.ALL)
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    private List<Pojo2> itens;
}

2° - Pojo

@Entity
public class Pojo2 {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(nullable = false)
    private Pojo1 pojo1;
}

As duas entidades que participam desse relacionamento estão configuradas da forma descrita acima. Quando salvo um objeto do tipo Pojo1 ele salva tranquilo os itens (ou seja, a lista de Pojo2). Porém quando removesse um pojo1 gostaria que ele removesse em cascata todos os filhos (a lista de Pojo2).

Já tentei com CascadeType. : DELETE_ORPHAN, ALL; porém sempre da pau de restrição de chave.

Alguma dica ?

2 Respostas

L

Da pal porque você não diz quem o pai dos Pojo2.
O Código é assim:

package beans;

import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

@Entity
@Table
public class Pojo1 {
	private Integer id;
	private List<Pojo2> pojos2 = new LinkedList<Pojo2>();
	
	
	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	
	
	@OneToMany(cascade=CascadeType.ALL,mappedBy="pai")
	@Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	public List<Pojo2> getPojos2() {
		return pojos2;
	}
	public void setPojos2(List<Pojo2> pojos2) {
		this.pojos2 = pojos2;
	}
	
	public void addPojo2(Pojo2 p){
		pojos2.add(p);
		p.setPai(this);
	}
	
	
}
package beans;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table
public class Pojo2 {
	private Integer id;
	private Pojo1 pai;
	
	@GeneratedValue
	@Id
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	
	
	@ManyToOne
	@JoinColumn(name="pai",nullable=false)
	public Pojo1 getPai() {
		return pai;
	}
	public void setPai(Pojo1 pai) {
		this.pai = pai;
	}
	
	
	
}
package dao;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

import beans.Pojo1;
import beans.Pojo2;

public class Dao {

	
	public static void main(String[] args) {
		AnnotationConfiguration ac = (AnnotationConfiguration) new AnnotationConfiguration().configure();
		ac.addAnnotatedClass(Pojo2.class);
		ac.addAnnotatedClass(Pojo1.class);
		
		SessionFactory sf = ac.buildSessionFactory();
		
		org.hibernate.Session s = sf.openSession();
		Transaction tx = s.beginTransaction();
		
		SchemaExport ex = new SchemaExport(ac);
		ex.setFormat(true);
		ex.drop(true, true);
		ex.create(true, true);
		
		Pojo1 p = new Pojo1();
		p.addPojo2(new Pojo2());
		p.addPojo2(new Pojo2());
		p.addPojo2(new Pojo2());
		
		s.save(p);

		Pojo1 p1 = (Pojo1) s.get(Pojo1.class, 1);
	
		s.delete(p1);
		
		
		
		tx.commit();
		s.close();
		
		
		
	}
}

Veja que na classe Pojo1, toda vez que eu insiro um Pojo2 na minha lista, eu uso o método addPojo2.
Dentro dele, eu adiciono a instância de pojo2 na minha lista e ao mesmo tempo atribuo a referência do pai
de Pojo2 através do setter setPai

T

Fiz novos testes aqui e funcionou blz.

Abraços,

Criado 26 de novembro de 2008
Ultima resposta 27 de nov. de 2008
Respostas 2
Participantes 2