Hibernate - Save List

3 respostas
V

Tenho uma classe que possui uma lista.

@Entity
@Table(name = "loteRetorno")
public class LoteRetorno {


	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_loteRetorno", unique = true, nullable = false)
	private int idLoteRetorno;

	@Column(name = "valor1", nullable = false)
	private int valor1;

	@Column(name = "valor2", nullable = false)
	private int valor2;

	@OneToMany(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_dadosloterecebido")
	private List<DadosLoteRetorno> dadosLote;

       //get´s set´s
}

a classe da lista é a seguinte:

@Entity
@Table(name = "DadosLoteRetorno")
public class DadosLoteRetorno{

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_dadosloterecebido", unique = true, nullable = false)
	private int idDadosLoteRecebido;

	@Column(name = "numero", length = 20, nullable = false)
	private String numero;

	@Column(name = "nome", length = 100, nullable = false)
	private String nome;

       //get´s set´s
}

estou querendo fazer um insert no banco. Monto a LoteRetorno e populo a lista de DadosLoteRetorno.
Entretanto quando faço um HibernateUtil.getSession().saveOrUpdate(LoteRetorno); ou HibernateUtil.getSession().save(LoteRetorno); ocorre a execption abaixo:

Hibernate: insert into loteguiaretorno ....
Hibernate: update dadosloteretorno set id_dadosloterecebido=? where id_dadosloterecebido=?
2009-08-31 16:04:15,486 ERROR [http-80-2] (AbstractFlushingEventListener.java:301) - Could not synchronize database state with session
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.DadosLoteRetorno

como resolvo esse erro ?

3 Respostas

V

anyone ?

B

Este erro já foi discutido diversas vezes aqui. Basta dar um search

V

Ele reclama porque os DadosLoteRetorno associados não foram persistidos ainda. Você deve criar a associação entre os objetos de ambos os lados. Altere na LoteRetorno a linha onde você anota a lista, assim:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "lote", cascade = CascadeType.PERSIST) private List<DadosLoteRetorno> dadosLote;E na DadosLoteRetorno:

@ManyToOne(fetch = FetchType.LAZY) private Lote lote;Talvez funcione só com o cascade, sem adicionar o outro lado da relação, mas essa é a forma correta!

Testa ae e diz se funcionou! Flw! :thumbup:

Criado 31 de agosto de 2009
Ultima resposta 3 de set. de 2009
Respostas 3
Participantes 3