o Usuario está com algum atributo transiente, ou seja, algum relacionamento que não está com o id setado. Dá uma pesquisada sobre os estados do hibernate.
david.cs20
Pesquisei porem não consegui entender.
Pois ele faz todas as operações inclusive quando excluo o Pai ele atualiza o filho sem excluir. Abaixo vou escrever meu código para ver se tem algo errado referente a anotação que esta faltando ou algo do tipo:
Usuario:
@ManyToOne
private Grupo grupoComoEntrevistador;
GrupoDAO:
public Grupo alterar(Grupo grupo) throws CadastroException {
Collection<Usuario> entrevistadores = new ArrayList<Usuario>();
for (Usuario entrevistador : grupo.getEntrevistadores()) {
Usuario entrevistadorPersistente = usuarioDao.get(entrevistador.getId());
entrevistadores.add(entrevistadorPersistente);
entrevistadorPersistente.setGrupoComoEntrevistador(grupo);
usuarioDao.saveOrUpdate(entrevistadorPersistente);
}
Update(grupo);
return grupo;
}
Lucas_Cavalcanti
pq vc está jogando os usuarios na lista entrevistadores? repare que vc tá salvando um usuario, mas é um usuário diferente do que está no grupo… vc precisa modificar o usuário que está dentro do grupo…
talvez faltou um grupo.setEntrevistadores(entrevistadores) depois do for.
david.cs20
Obrigado lucas pela resposta !
Porem ainda fica dando o erro apesar de já alterar o valor na tabela.
Segue erro:
Abr 04, 2012 11:07:41 AM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet [default] in context with path [/futura] threw exception
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: ws.futuranet.modelo.Usuario; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: ws.futuranet.modelo.Usuario
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87)
at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:48)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: ws.futuranet.modelo.Usuario; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: ws.futuranet.modelo.Usuario
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:654)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:705)
at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:701)
at ws.futuranet.dao.GenericDAO.Update(GenericDAO.java:28)
at ws.futuranet.dao.GrupoDAO.alterar(GrupoDAO.java:57)
at ws.futuranet.dao.GrupoDAO$$FastClassByCGLIB$$21406927.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621)
at ws.futuranet.dao.GrupoDAO$$EnhancerByCGLIB$$7b8454fe.alterar(<generated>)
at ws.futuranet.controller.GruposController.alterar(GruposController.java:43)
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 br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
... 46 more
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: ws.futuranet.modelo.Usuario
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:242)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:430)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:101)
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2025)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2399)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2335)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2635)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:115)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:407)
... 61 more
Lucas_Cavalcanti
vê se não tem algum usuário sem id no meio do caminho
david.cs20
Não todos os usuários que estão no meu array estão com o id preenchidos.
Tentei colocar flush, merge e save no GenericDAO porem continuou dando erro.
Lucas_Cavalcanti
tem certeza?
todos os usuários que estão dentro do grupo estão com o id preenchidos?
se sim, todos eles estão carregados do banco?
senão o problema está em outro lugar
david.cs20
Todos estão carregados sim.
Pode ser algo na forma que estou fazendo o relacionamento ??
não tem cara de ser conf do spring… é alguém que tá transient… algum dos usuários está com um id que não existe no bd?
ou ainda, tem algum null nessa lista?
david.cs20
Existe alguma forma de testa isso alem do debug ?!
Lucas_Cavalcanti
pra ver o que tem no objeto?
só metendo um monte de sysouts ou logs…
às vezes o problema não é no Grupo, é em algum outro objeto que vc tá se relacionando…
debug talvez seja mais fácil pra descobrir isso…
david.cs20
Em algumas pesquisas que fiz vi algumas pessoas falando que tinha que ter implementado o método equals na classe filho.
Lucas_Cavalcanti
esse erro não tem nada a ver com o equals…
tem algum cara relacionado ao cara que vc quer salvar/mergear que está transiente (sem id ou com um id que não existe no banco)
david.cs20
Depois de muito sacrifiu achei quem eh
Eu tenho um outro relacionamento dentro dessa classe:
@ManyToOne
private Usuario supervisor;
Ele fica nulo quando entra no Update do GenericDAO:
@Transactional(propagation=Propagation.REQUIRED)
public void Update(T obj) throws DataAccessException {
template.update(obj);
}
Lucas_Cavalcanti
não tem problema ele ser nulo, tem problema ele ter o id nulo… ou resolveu o problema?
david.cs20
Ele esta passando o nome os dados certinhos porem o id esta indo nulo !!!
Como posso passar esse id ?!
david.cs20
Tentei desse jeito:
publicGrupoalterar(Grupogrupo)throwsCadastroException{
Collection<Usuario> entrevistadores = new ArrayList<Usuario>();for(Usuarioentrevistador:grupo.getEntrevistadores()){
UsuarioentrevistadorPersistente=usuarioDao.get(entrevistador.getId());entrevistadores.add(entrevistadorPersistente);entrevistadorPersistente.setGrupoComoEntrevistador(grupo);usuarioDao.Update(entrevistadorPersistente);}
grupo.setEntrevistadores(entrevistadores);Usuariosupervisor=grupo.getSupervisor();grupo.setSupervisor(usuarioDao.get(supervisor.getId()));Update(grupo);returngrupo;}