Transaction not active!

4 respostas
M

Olá após eu colocar meu managed bean em escopo de sessão eu cadastro esse bean no banco mas quando vou fazer o cadastro novamente aparece o seguinte erro:

Obs: Quando eu tiro meu managed bean do escopo de sessão(request) eu consigo cadastrar varias vezes normalmente. Alguém ajuda?

SEVERE: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.cyclonet.modelo.Sistema
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1316)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:881)
	at br.com.cyclonet.dao.SistemaDAO.cadastrar(SistemaDAO.java:32)
	at br.com.cyclonet.bean.SistemaBean.cadastrar(SistemaBean.java:43)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:771)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:786)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1251)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at br.com.cyclonet.filtro.EntityManagerFiltro.doFilter(EntityManagerFiltro.java:45)
	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:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.cyclonet.modelo.Sistema
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78)
	at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:853)
	at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:827)
	at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:831)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:875)
	... 40 more

Ago 09, 2013 3:10:09 PM com.sun.faces.context.ExceptionHandlerImpl log
SEVERE: JSF1073: javax.faces.event.AbortProcessingException obtido durante o processamento de INVOKE_APPLICATION 5: UIComponent-ClientId=formSistema:j_idt20, Message=javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.cyclonet.modelo.Sistema
Ago 09, 2013 3:10:09 PM com.sun.faces.context.ExceptionHandlerImpl log
SEVERE: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.cyclonet.modelo.Sistema
javax.faces.event.AbortProcessingException: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.cyclonet.modelo.Sistema
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:182)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:771)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:786)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1251)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at br.com.cyclonet.filtro.EntityManagerFiltro.doFilter(EntityManagerFiltro.java:45)
	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:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)
Caused by: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.cyclonet.modelo.Sistema
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1316)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:881)
	at br.com.cyclonet.dao.SistemaDAO.cadastrar(SistemaDAO.java:32)
	at br.com.cyclonet.bean.SistemaBean.cadastrar(SistemaBean.java:43)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
	... 31 more
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.cyclonet.modelo.Sistema
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78)
	at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:853)
	at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:827)
	at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:831)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:875)
	... 40 more

Ago 09, 2013 3:10:09 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/upcyclonet] threw exception
java.lang.IllegalStateException: Transaction not active
	at org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:103)
	at br.com.cyclonet.util.EntityManagerUtil.rollback(EntityManagerUtil.java:44)
	at br.com.cyclonet.filtro.EntityManagerFiltro.doFilter(EntityManagerFiltro.java:51)
	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:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)

4 Respostas

R

Você tem que entender como o hibernate/jpa funciona. Pela descrição do que você ta fazendo e pelo stack trace, o problema é que você ta passando para o método persist() um objeto que foi criado em outra sessão JPA e agora está no estado detached. A solução mais prática em termos de JPA, seria usar o método merge() no lugar do persist().

Uma entidade pode estar em 3 estados: transient, persistent, detached. Da uma estudada no que cada um desses estados significa.

Uma dica: Existe a sessão da aplicação web e a sessão jpa (persistence context). São coisas diferentes.

M

Rodrigo dei uma pesquisada sobre e consegui entender, resolvi colocando um new no objeto no final do método de cadastro ai meu form atualiza o objeto e os dados anteriormente somem e assim o cadastro é realizado.

Só para entender: É que eu tenho que salvar uma imagem desse objeto que eu estou cadastrando com o ID do mesmo. Ou seja eu persisto o objeto dps recupero esse ultimo cadastro e com ID dele renomeio a imagem e dou um merge.

Quando meu objeto é persistido e após o commit o modo datached é acionado pois o EM não está associado ao objeto, mas ai eu tenho o seguinte cenário: Quando eu removo o new do objeto que eu citei acima e dou um merge ele não adiciona um novo objeto ele sobrepõe o outro(Óbvio né) mas o que eu queria era fazer com que o usuário reutilizasse os dados que estavam no outro objeto que foi cadastrado anteriormente.

Não sei se ficou confuso, qualquer coisa tento explicar de outra forma.

Abraço

R

Cara, realmente ficou um pouco confuso :slight_smile:

Você precisa persistir o mesmo objeto duas vezes? Com o mesmo id e tudo?

M

Rodrigo consegui resolver, veja como ficou. Críticas pls?

public Boolean cadastrar(Cliente cliente) 
	{
		em = EntityManagerUtil.getEntityManager();
		
		//Query
		String jpql = "SELECT c FROM Cliente c WHERE c.cnpj = :cnpj";
		TypedQuery<Cliente> query = em.createQuery(jpql,Cliente.class);
		query.setParameter("cnpj", cliente.getCnpj());
		List<Cliente> cli = query.getResultList();
		
		//Já existe ?
		if(!cli.isEmpty())
		{
			return false;
		}
		else
		{
			//Resgatar todos os objetos de endereco, cidade, estado, etc
			Endereco end = em.find(Endereco.class, cliente.getEndereco().getCep());
			
			//Setando o endereço para o cliente			
			cliente.setEndereco(end);
			
			/*	Quando o cliente fizer login pela primeira vez 
			*será redirecionado para uma alteração de senha*/			
			Byte flag = 1;
			cliente.setAcesso(flag);
			
			//Opa, objeto comecou a ser gerenciado
			em.persist(cliente);
		
			//Se no form foi inserido uma foto... fileUpload(PrimeFaces)
			if (cliente.getUpLogo()!=null)
			{				
				//Ler arquivo properties
				ArquivoUtil aUtil	= new ArquivoUtil();
				String caminho = aUtil.getValorProperties(pathImagens);	
				
				//Retiro a mascara do cnpj
				String nome = cliente.getCnpj();
				nome = nome.replace(".","");
				nome = nome.replace("/","");
				nome = nome.replace("-","");
				
				//O método estatico tratarArquivo grava a imagem no servidor
				//Estou capturando um possivel erro aqui mas vou lança-lo para o MB e assim apresentar uma mensagem de erro certo?
				try {
					ArquivoUtil.tratarArquivo(caminho,nome,".png", cliente.getUpLogo());
					cliente.setLogo(caminho+nome+".png");
				} catch (IOException e) {
					
					e.printStackTrace();
				}
			}
			
			return true;
		}
	}
Criado 9 de agosto de 2013
Ultima resposta 3 de set. de 2013
Respostas 4
Participantes 2