Java.lang.IllegalStateException: Transaction not active

3 respostas
F

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:

<blockquote>

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)</blockquote>

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!

3 Respostas

R

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

Estou tendo um problema assim

<blockquote>     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)</blockquote>
R

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.

A

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

Criado 10 de fevereiro de 2009
Ultima resposta 3 de jan. de 2011
Respostas 3
Participantes 3