Problema com Cascade no Hibernate

1 resposta
B

Ola pessoa, bom dia a todo!!!
Estou com um problema um pouco chato com Hibernate Annotations, já procurei no forum e encontrei problemas parecidos, mais mesmo assim não consegui resolver de fato.
Bem, meu problema ná na hora de fazer com que o Hibernate faça o cascade para salvar um objeto, tenho um objeto do tipo ITEM que tem uma associação OneToMany com o objeto OFERTA.
Quando executo o método save(ITEM) um item é salvo mais a lista de OFERTA não, deste modo o cascade não esta funcionado;

Segue o codigo:

Classe ITEM

@Entity
@Table(name = "ITEM")
@SequenceGenerator(name = "ID_ITEM_SEQ", sequenceName = "ID_ITEM_SEQ")
public class Item {

	@Id
	@GeneratedValue(generator = "ID_ITEM_SEQ", strategy = GenerationType.AUTO)
	private int id;

	@Column(name = "NOME")
	private String nome;

	@Column(name = "PRECO_INICIAL")
	private float precoInicial;

	@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }, mappedBy = "item", targetEntity = br.com.modelo.dominio.Oferta.class)
	private Set<Oferta> oferta = new HashSet<Oferta>();

       //construtor, get, set ...
}

Classe OFERTA

@Entity
@Table(name = "OFERTA")
@SequenceGenerator(name = "ID_OFERTA_SEQ", sequenceName = "ID_OFERTA_SEQ")
public class Oferta {

	@Id
	@GeneratedValue(generator = "ID_OFERTA_SEQ", strategy = GenerationType.AUTO)
	@Column(name = "ID_OFERTA")
	private int id;

	@Column(name = "VALOR")
	private float valor;

	@ManyToOne(targetEntity = br.com.modelo.dominio.Item.class)
	@JoinColumn(name = "ID_ITEM", nullable = false)
	private Item item;

       //construtor, get, set ...
}

Salvando o objeto

public static void main(String[] args) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction t = session.beginTransaction();
		
		Start s = new Start();
		session.save(s.createItem());

		t.commit();
		session.close();
		HibernateUtil.shutdown();
	}

	private Item createItem(){
		Item i = new Item();
		Oferta o = new Oferta();
		Set<Oferta> s = new HashSet<Oferta>();
		
		//seta a oferta
		o.setValor(35);
		o.setItem(i);
		
		//adiciona o HashSet
		s.add(o);
		
		//seta o item
		i.setNome("Qualquer coisa");
		i.setPrecoInicial(22);
		i.setOferta(s);
		return i;
	}

Estou utilizando as seguinte jar’s;

commons-collections-3.2.1.jar commons-logging-1.1.jar dom4j-1.6.1.jar ejb3-persistence.jar hibernate-annotations.jar hibernate-commons-annotations.jar hibernate-core.jar javassist-3.9.0.GA.jar jta-1.1.jar log4j-1.2.15.jar postgresql-8.3-605.jdbc2.jar slf4j-api-1.5.8.jar slf4j-jcl-1.5.8.jar

com java 1.6.

Bom pessoal é isso ai, se puderem me ajudar, desde já os meus agradecimentos.

1 Resposta

B

Ai pessoal só para constar, o problema que citei acima quando utilizando

@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY, mappedBy="item", targetEntity = br.com.modelo.dominio.Oferta.class)
      private Set<Oferta> oferta = new HashSet<Oferta>();

que o cascade não estava funcionando é o seguinte:

estava utilizando o método session.save(), desta forma quando eu persistia um objeto o mesmo não persistia por cascata o seu relacionamento, logo percebi que deveria utilizar o método session.persist().

caso queira utilizar o método session.save() deve-se trocar o mapeamento por @OneToMany(cascade =CascadeType.ALL) ou então @Cascade(value=org.hibernate.annotations.CascadeType.SAVE_UPDATE).

bom espero ter contribuído com a comunidade.

Criado 17 de novembro de 2009
Ultima resposta 18 de nov. de 2009
Respostas 1
Participantes 1