[RESOLVIDO]org.hibernate.TransientObjectException

4 respostas
G

Olá amigos,

Estou tendo problema ao salvar a UF no Servidor.
Pesquisei aqui no GUJ mesmo a respeito disso, algumas algumas soluções foram colocar no mapeamento um cascade={CascadeType.PERSIST, CascadeType.MERGE}. Mas continuo recebendo a exception.
Alguém saberia indicar o meu erro ?

Obrigado!!!

Erro:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.gov.pgfn.scif.core.model.bean.Uf
	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
	at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:78)
	at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:1947)
	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2321)
	at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2257)
	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2557)
	at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:92)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
	at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy35.saveOrUpdate(Unknown Source)
	at br.gov.pgfn.scif.web.controller.FormularioController.update(FormularioController.java:98)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Classe Servidor
@Entity
@Table(name="servidor")
public class Servidor extends AbstractBean implements Serializable {

	private static final long serialVersionUID = 7831737513880564868L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="id", nullable=false)
	private Integer idServidor;	
	
	@Column(name="cpf", nullable=true, length=11)
	private String cpf;
	
	@NotEmpty
	@Column(name="nome", nullable=true, length=150)
	private String nome;

	@NotEmpty
	@Column(name="nome_pai", nullable=true, length=150)
	private String nomePai;	
		
	@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE}, optional=true)
	@JoinColumn(name="id_uf_oab")
	private Uf ufOAB;
	
}
Classe UF
@Entity
@Table(name="uf")
public class Uf extends AbstractBean implements Serializable {
	
	private static final long serialVersionUID = -4563563610439201855L;	
	
	@Id
	@NotNull
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="id", nullable=false)
	private Integer idUf;
	
	@Column(name="sigla", nullable=false, length=2)
	private String sigla;	
	
}

4 Respostas

H

Aqui explica o problema e como resolve-lo: JPA: Mini Livro - Primeiros passos e conceitos detalhados.

R

Você tem que entender como funciona o JPA.

Do ponto de vista do contexto de persistência, uma entidade pode estar em vários estados, pode ser:

Novo (New) -> Um objeto que foi criado, ainda não teve contato com o contexto de persistência
Gerenciado (Managed) -> Está sendo gerenciado pelo contexto, ele foi ou persistido/alterado agora, ou buscado do DB
Separado (Detached) -> Ele já foi gerenciado pelo contexto, porém agora não está mais
Removido (Removed) -> Ele foi excluído do banco de dados

O que acontece quando você tenta gravar seu objeto servidor?

Você associa um UF a ele, e é um UF que já existe no banco. Então você pensa: “A PK está igualzinho no banco, portanto ele vai saber que o objeto já existe”.

Só que isso não é bem verdade, pois seu objeto UF está Detached. Você precisa de alguma maneira torná-lo gerenciado, a maneira mais fácil no seu caso seria buscando novamente, pelos métodos find, getReference ou até por uma query. Algo assim: public void salvarServidor(Servidor servidor){ servidor.setUf(entityManager.getReference(Uf.class, servidor.getUf().getId()); entityManager.persist(servidor); } Essa pode não ser a melhor maneira, mas é uma solução bem direta para o seu problema, e exemplifica o que eu disse.

Quando ele se tornar gerenciado, seu servidor será persistido normalmente.

Dê uma olhada no link que o Hébert postou, ali devem existir exemplos de como fazer isso.

G

Hebert Coelho e Rodrigo Sasaki, muito obrigado pela contribuição.

A explicação do JPA: Mini Livro do Hebert Coelho resolveu o problema.

Abraços !!!

G

gabrielmelo:
Hebert Coelho e Rodrigo Sasaki, muito obrigado pela contribuição.

A explicação do JPA: Mini Livro do Hebert Coelho resolveu o problema.

Abraços !!!

Criado 6 de fevereiro de 2013
Ultima resposta 8 de fev. de 2013
Respostas 4
Participantes 3