Transaction not active!

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?

[code]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)[/code]

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.

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

Cara, realmente ficou um pouco confuso :slight_smile:

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

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

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