Java.lang.IllegalStateException: Transaction not active

Olá pessoal.
Estou com problemas para executar um update nos meus dados utilizando o hibernate + jsf

meu método para fazer o update é esse:


private EntityTransaction transaction = null;

public void update() {
        String param = hibernate.context.Contexts.getRequestParameter("update");
        try {
            numForm = Integer.parseInt(param);
            form = findForm(numForm);
            EntityManager em = hibernate.context.Contexts.getEntityManager();

            transaction = em.getTransaction();
            transaction.begin();
            form = em.merge(form);
            transaction.commit();

            hibernate.controller.Controller.addSuccessMessage("Alterado.");

        } catch (Exception e) {
            try {
                transaction.rollback();
                hibernate.controller.Controller.addErrorMessage("Erro durante a alteração do formulário de número " + param);

            } catch (Exception ex) {
                hibernate.controller.Controller.ensureAddErrorMessage(ex, "An error occurred attempting to roll back the transaction.");
            }
        }
        
    }

quando eu executo ele, eu obtenho o erro no log:

[quote]
hibernate.filter.EntityManagerFilter doFilter
java.lang.IllegalStateException: Transaction not active
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:47)
at hibernate.filter.EntityManagerFilter.doFilter(EntityManagerFilter.java:64)
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:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128 )
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:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)[/quote]

esse erro especifica um linha do meu arquivo EntityManagerFilter no método doFilter (linha 64)
esse é meu doFilter:

public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws ServletException, IOException {

        EntityManager em = entityManagerFactory.createEntityManager();
        request.setAttribute("entitymanager", em);
        EntityTransaction tx = null;
        try {
            // begin the transaction
            tx = em.getTransaction();
            tx.begin();

            // continue processing to JSF
            chain.doFilter(request, response);

            // after returning from JSF commit the transaction
            tx.commit();

        } catch (RuntimeException e) {
            // if something fails, log the error and rollback
            log.log(Level.SEVERE, "",e);
            tx.rollback();
        } finally {
            // always close the entitymanager
            em.close();
        }
    }

Alguém sabe como eu posso arrumar esse problema?

valeu!

olá. conseguiu resolver este problema “Transaction not active” ?

Estou tendo um problema assim

[quote] Exception in thread “Thread-5” java.lang.IllegalStateException: Transaction not active
at org.hibernate.ejb.TransactionImpl.getRollbackOnly(TransactionImpl.java:110)
at org.springframework.orm.jpa.JpaTransactionManager$JpaTransactionObject.isRollbackOnly(JpaTransactionManager.java:598)
at org.springframework.transaction.support.DefaultTransactionStatus.isGlobalRollbackOnly(DefaultTransactionStatus.java:154)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:720)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy122.processarRemetida(Unknown Source)[/quote]

Resolvido !

Creio que o problema é porque quando acontece esta exceção deve-se verificar por algum commit separado dos outros; assim com era na minha aplicação.
Sendo assim; no local deste commit exclusivo deve-se utilizar um Factory para obter novas referencias aos objetos relacionados ao banco (hibernateSession, entityManager, etc). Utilizando somente esses, e nunca utilizar algo disponível na classe abstrata que é para casos mais genéricos.

Em resumo a solução do meu problema foi essa.

Pode ser mais claro com a solução aplicada?