[RESOLVIDO]org.hibernate.TransientObjectException

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

[code]@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;

}[/code]

Classe UF

[code]@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;	

}[/code]

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

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.

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 !!!

[quote=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 !!![/quote]