VRAPTOR+HIBERNATE = org.hibernate.TransientObjectException[RESOLVIDO]

8 respostas
kivervinicius

Boa tarde,
pessoal, seguinte, estou fazendo minha aplicação utilizando vraptor e hibernate, oq acontece, tenho muitas propertys com many-to-one, que não são obrigatorias, e quando vou salvar, ele me da seguinte mensagem

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.tga.juridico.entidades.cadastros.Acao org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)

Oq acontece, o vraptor me retorna o objeto e dentro dele tem uma propriedade com propriedades nulas.

Por exemplo

Processo Long id Acao acao

o vraptor me retorna uma instancia de Acao, com os atributos todos nulos, no que para o hibernate gera o erro.

para resolver fiz assim.

public void setAcao(Acao acao) { if (acao.getId() != null) this.acao = acao; else this.acao = null; }

Mas gostaria de uma solução mais fácil ou generica para diminuir o trabalho.

tem mais informações em um outro topico meu.

Desculpe a duplicidade.

http://www.guj.com.br/java/274418-orghibernatetransientobjectexception

8 Respostas

kivervinicius

Da forma que eu coloquei antes não funciona. dai tive que mudar no controller para

@Post
	@Path("/processo")
	public void adiciona(final Processo processo) {
		if(processo.getAcao().getId() == null){
			processo.setAcao(null);
		}
		
		if(processo.getCamara().getId() == null){
			processo.setCamara(null);
		}
		
		if(processo.getComarca().getId() == null){
			processo.setComarca(null);
		}
		
		if(processo.getMoeda().getId() == null){
			processo.setMoeda(null);
		}
		
		if(processo.getInstancia().getId() == null){
			processo.setInstancia(null);
		}
		
		if(processo.getJustica().getId() == null){
			processo.setJustica(null);
		}
		
		if(processo.getTribunal().getId() == null){
			processo.setTribunal(null);
		}
		
		if(processo.getVara().getId() == null){
			processo.setVara(null);
		}
		
		if(processo.getSituacao().getId() == null){
			processo.setSituacao(null);
		}
		
		dao.salva(processo);
		result.redirectTo(this).lista("");
	}

Mas para mim essa é uma forma muito ruim de se lidar com esse problema. :(

Lucas_Cavalcanti

já que sua entidade tem tantos relacionamentos, vc pode tentar fazer um filtro que remove os parâmetros vazios.

crie esse filtro:

coloque ele pra rodar antes do filtro do vraptor (só declarar o filter-mapping dele antes do do vraptor), e url-pattern /*

se não funcionar dá um toque que eu mudo o gist.

kivervinicius

Opa, lucas obrigado, coloquei o filter mas não fui bem sucedido.

Debuguei ele, passa por todos as propriedades mas qndo ele passa pro metodo edita, ele me retorna só

Erro genérico é o porre. rs

Lucas_Cavalcanti

Vinicius, sempre que vc vir uma exception, é importante saber onde ela está ocorrendo…

procura a linha:

Caused by: java.lang.NullPointerException

e veja a linha que está logo embaixo… ela é a fonte do nullpointer, e provavelmente é lá que vc precisa mexer.

kivervinicius
Lucas Cavalcanti:
Vinicius, sempre que vc vir uma exception, é importante saber onde ela está ocorrendo... procura a linha:
Caused by: java.lang.NullPointerException
e veja a linha que está logo embaixo... ela é a fonte do nullpointer, e provavelmente é lá que vc precisa mexer.

Ok, vamos la.

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.NullPointerException
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	br.com.tga.juridico.diversos.ParametersFilter.doFilter(ParametersFilter.java:30)
root cause

java.lang.NullPointerException
	br.com.tga.juridico.controller.movimentacao.ProcessoController.altera(ProcessoController.java:110)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	br.com.tga.juridico.diversos.ParametersFilter.doFilter(ParametersFilter.java:30)
Lucas_Cavalcanti

java.lang.NullPointerException
br.com.tga.juridico.controller.movimentacao.ProcessoController.altera(ProcessoController.java:110)

o que tem nessa linha? me refiro à linha 110 do ProcessoController. O que pode estar null nela?

kivervinicius

Agora deu certo, mas ele deu nullPointer pq eu só tinha comentado a linha que pegava o get do ação

/*if(processo.getAcao().getId() == null){
			processo.setAcao(null);
		}*/
		
		if(processo.getCamara().getId() == null){
			processo.setCamara(null);
		}
		
		if(processo.getComarca().getId() == null){
			processo.setComarca(null);
		}
		
		if(processo.getMoeda().getId() == null){
			processo.setMoeda(null);
		}
		
		if(processo.getInstancia().getId() == null){
			processo.setInstancia(null);
		}
		
		if(processo.getJustica().getId() == null){
			processo.setJustica(null);
		}
		
		if(processo.getTribunal().getId() == null){
			processo.setTribunal(null);
		}
		
		if(processo.getVara().getId() == null){
			processo.setVara(null);
		}
		
		if(processo.getSituacao().getId() == null){
			processo.setSituacao(null);
		}

Quando tirei todas as verificações funcionou.

kivervinicius

Desculpe a ignorancia, mas foi besteira minha mesmo, como ele ia dar um getId(), se o filter setou null o objeto.

rs, vlw lucas

abraço

Criado 31 de maio de 2012
Ultima resposta 2 de jun. de 2012
Respostas 8
Participantes 2