Problemas com save the transient instance before flushing:

11 respostas
eveban

Boa tarde !
Estou tendo problemas com mapeamento, Não estou conseguindo salvar dados de um formulário de cadastro de peças com relacionamento em uma tabela de fornecedores.

sou novato em java
segue abaixo o erro, se alguém puder me ajudar, eu agradeço.

16:40:40,757 ERROR [STDERR] java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: modelo.Fornecedores

16:40:40,758 ERROR [STDERR] 	at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:626)

16:40:40,758 ERROR [STDERR] 	at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:236)

16:40:40,758 ERROR [STDERR] 	at dao.PecasDAO.salvar(PecasDAO.java:29)

16:40:40,758 ERROR [STDERR] 	at controlador.PecasMB.salvarPecas(PecasMB.java:69)

16:40:40,758 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

16:40:40,758 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

16:40:40,758 ERROR [STDERR] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

16:40:40,758 ERROR [STDERR] 	at java.lang.reflect.Method.invoke(Unknown Source)

16:40:40,758 ERROR [STDERR] 	at org.apache.el.parser.AstValue.invoke(AstValue.java:131)

16:40:40,758 ERROR [STDERR] 	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)

16:40:40,758 ERROR [STDERR] 	at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)

16:40:40,758 ERROR [STDERR] 	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)

16:40:40,758 ERROR [STDERR] 	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)

16:40:40,759 ERROR [STDERR] 	at javax.faces.component.UICommand.broadcast(UICommand.java:387)

16:40:40,759 ERROR [STDERR] 	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)

16:40:40,759 ERROR [STDERR] 	at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)

16:40:40,759 ERROR [STDERR] 	at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)

16:40:40,759 ERROR [STDERR] 	at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466)

16:40:40,759 ERROR [STDERR] 	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)

16:40:40,759 ERROR [STDERR] 	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)

16:40:40,759 ERROR [STDERR] 	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)

16:40:40,759 ERROR [STDERR] 	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)

16:40:40,759 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

16:40:40,759 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

16:40:40,759 ERROR [STDERR] 	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)

16:40:40,759 ERROR [STDERR] 	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)

16:40:40,759 ERROR [STDERR] 	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390)

16:40:40,759 ERROR [STDERR] 	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517)

16:40:40,759 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

16:40:40,759 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

16:40:40,759 ERROR [STDERR] 	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

16:40:40,759 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

16:40:40,759 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

16:40:40,759 ERROR [STDERR] 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)

16:40:40,759 ERROR [STDERR] 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)

16:40:40,759 ERROR [STDERR] 	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)

16:40:40,759 ERROR [STDERR] 	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)

16:40:40,760 ERROR [STDERR] 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)

16:40:40,760 ERROR [STDERR] 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

16:40:40,760 ERROR [STDERR] 	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)

16:40:40,760 ERROR [STDERR] 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

16:40:40,761 ERROR [STDERR] 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)

16:40:40,761 ERROR [STDERR] 	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)

16:40:40,761 ERROR [STDERR] 	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)

16:40:40,761 ERROR [STDERR] 	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)

16:40:40,761 ERROR [STDERR] 	at java.lang.Thread.run(Unknown Source)

16:40:40,761 ERROR [STDERR] Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: modelo.Fornecedores

16:40:40,762 ERROR [STDERR] 	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.type.EntityType.replace(EntityType.java:253)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.type.AbstractType.replace(AbstractType.java:153)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.type.TypeFactory.replace(TypeFactory.java:515)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.event.def.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:377)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:179)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:240)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:120)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665)

16:40:40,762 ERROR [STDERR] 	at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:227)

16:40:40,763 ERROR [STDERR] 	 44 more

11 Respostas

B

Poste suas entidades, você está utilizando cascade nos seus relacionamentos ?

rogelgarcia

Peca está com um Fornecedor

Esse fornecedor tá sem valor no id…

Ou o fornecedor tem que ser null

Ou o fornecedor tem que tá com algum valor no id…

(id que eu meu refiro é o campo anotado com @Id)

rogelgarcia

E poste as classes como o Breno falou…

Se nao achar o problema

eveban

Estou usando cascade, mas não esta rolando.
Estou ennviando minhas entidades abaixo:

package modelo;

import java.io.Serializable;
import java.util.Collection;

import javax.persistence.CascadeType;
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.OneToMany;

@Entity
public class Fornecedores implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "forcod")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;

	@OneToMany(mappedBy = "fornecedores", cascade = CascadeType.ALL,  fetch = FetchType.EAGER)
	private Collection<Pecas> peca;
	
	//@OneToMany(mappedBy = "fornecedores", targetEntity=Pecas.class, cascade = CascadeType.ALL)
	//private Collection peca;

	private String fordescricao;
	private String forrua;
	private String forbairro;
	private String forfone;
	private String forfax;
	private String foremail;
	private String forsite;
	private String forcontato;

	public int getId() {
		return id;
	}

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

	public String getFordescricao() {
		return fordescricao;
	}

	public void setFordescricao(String fordescricao) {
		this.fordescricao = fordescricao;
	}

	public String getForrua() {
		return forrua;
	}

	public void setForrua(String forrua) {
		this.forrua = forrua;
	}

	public String getForbairro() {
		return forbairro;
	}

	public void setForbairro(String forbairro) {
		this.forbairro = forbairro;
	}

	public String getForfone() {
		return forfone;
	}

	public void setForfone(String forfone) {
		this.forfone = forfone;
	}

	public String getForfax() {
		return forfax;
	}

	public void setForfax(String forfax) {
		this.forfax = forfax;
	}

	public String getForemail() {
		return foremail;
	}

	public void setForemail(String foremail) {
		this.foremail = foremail;
	}

	public String getForsite() {
		return forsite;
	}

	public void setForsite(String forsite) {
		this.forsite = forsite;
	}

	public String getForcontato() {
		return forcontato;
	}

	public void setForcontato(String forcontato) {
		this.forcontato = forcontato;
	}

	public static long getSerialVersionUID() {
		return serialVersionUID;
	}
}
eveban
package modelo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Pecas {

	@Id
	@Column(name = "peccod")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;
	private String pecdescricao;

	@ManyToOne
	@JoinColumn(name = "forcod")
	private Fornecedores fornecedores;

	private String pectipo;

	public int getId() {
		return id;
	}

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

	public Fornecedores getFornecedores() {
		return fornecedores;
	}

	public void setFornecedores(Fornecedores fornecedores) {
		this.fornecedores = fornecedores;
	}

	public String getPecdescricao() {
		return pecdescricao;
	}

	public void setPecdescricao(String pecdescricao) {
		this.pecdescricao = pecdescricao;
	}

	public String getPectipo() {
		return pectipo;
	}

	public void setPectipo(String pectipo) {
		this.pectipo = pectipo;
	}

}
eveban
package dao;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import modelo.Fornecedores;

public class FornecedoresDAO {
	private static FornecedoresDAO instance = new FornecedoresDAO();

	private FornecedoresDAO() {

	}

	public static FornecedoresDAO getInstance() {
		return instance;
	}

	@SuppressWarnings("unchecked")
	public List<Fornecedores> getAll() {
		EntityManager em = PersistenceUtil.getEntityManager();
		Query query = em.createQuery("from Fornecedores as o");
		List<Fornecedores> fornecedor = (List<Fornecedores>) query
				.getResultList();
		PersistenceUtil.close(em);
		return fornecedor;
	}

	public Fornecedores getByPrimaryKey(Integer forcod) {
		EntityManager em = null;
		try {
			em = PersistenceUtil.getEntityManager();
			Fornecedores f = em.find(Fornecedores.class, forcod);
			return f;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			PersistenceUtil.close(em);
		}
		return null;
	}
	
	public void salvar(Fornecedores fornecedores) {
		EntityManager em = null;
		try {
			em = PersistenceUtil.getEntityManager();
			em.getTransaction().begin();
			if (fornecedores.getId()== 0) {
				em.persist(fornecedores);
			} else {
				fornecedores = em.merge(fornecedores);
			}
			em.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
		} finally {
			PersistenceUtil.close(em);
		}
	}

	public void excluir(Fornecedores fornecedores) {
		EntityManager em = null;
		try {
			em = PersistenceUtil.getEntityManager();
			em.getTransaction().begin();
			fornecedores = em.merge(fornecedores);
			em.remove(fornecedores);
			em.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
		} finally {
			PersistenceUtil.close(em);
		}
	}
}
eveban
package dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import modelo.Pecas;

public class PecasDAO {
	private static PecasDAO instance = new PecasDAO();

	private PecasDAO() {

	}

	public static PecasDAO getInstance() {
		return instance;
	}

	public void salvar(Pecas pecas) {
		EntityManager em = null;
		try {
			em = PersistenceUtil.getEntityManager();
			em.getTransaction().begin();
			if (pecas.getId() == 0) {
				em.persist(pecas);
			} else {
				pecas = em.merge(pecas);
			}
			em.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
		} finally {
			PersistenceUtil.close(em);
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Pecas> getAll() {
		EntityManager em = PersistenceUtil.getEntityManager();
		Query query = em.createQuery("from Pecas");
		List<Pecas> pecas = (List<Pecas>) query.getResultList();
		PersistenceUtil.close(em);
		return pecas;
	}



	public Pecas getByPrimaryKey(Integer peccod) {
		EntityManager em = null;
		try {
			em = PersistenceUtil.getEntityManager();
			Pecas p = em.find(Pecas.class, peccod);
			return p;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			PersistenceUtil.close(em);
		}
		return null;
	}

	public void excluir(Pecas pecas) {
		EntityManager em = null;
		try {
			em = PersistenceUtil.getEntityManager();
			em.getTransaction().begin();
			pecas = em.merge(pecas);
			em.remove(pecas);
			em.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
		} finally {
			PersistenceUtil.close(em);
		}
	}
}
rogelgarcia

Entao é isso mesmo que falei

Pecas tem Fornecedor

E ao salvar pecas fornecedor tá sem valor no campo id

Dicas:
[list]No campo id use Integer ao invés de int[/list]
[list]Use nome das entidades no singular… ao invés de Fornecedores use Fornecedor… pois um objeto dessa classe representa apenas 1 fornecedor…[/list]

rogelgarcia

Outra dica.. formate seu código com as tags [code]

eveban

blz, vou dar uma olhada nisso ja, assim se der algum problema, ja falo de novo.

Obrigado

eveban

Este campo que vc falou para eu trocar, é o da entidade Fornecedores.

trocar o private int id para private Integer id.
Correto ?
Se for esta alteração, deu o mesmo erro.
Tenho certeza que estou fazendo besteira, mas como sou novato, fica mais complicado.

Criado 23 de março de 2010
Ultima resposta 23 de mar. de 2010
Respostas 11
Participantes 3