JPA Transaction

4 respostas
P

tenho o seguinte método:

<a class="mention" href="/u/override">@Override</a>

@Transactional

public void fieldTEXT() {

descricaoRepository.corrigeStr();

descricaoDetalheRepository.corrigeStr();

entradasRepository.corrigeStr();

farmaciasRepository.corrigeStr();

licitacaoRepository.corrigeStr();

licitacaoPedidoRepository.corrigeStr();

pedidosRepository.corrigeStr();

perdasRepository.corrigeStr();

saidaRepository.corrigeStr();

transferenciasRepository.corrigeStr();

fechamentoRepository.corrigeStr();

fechamentoCompetenciaRepository.corrigeStr();

internacaoRepository.corrigeStr();

exameLaboratorioRepository.corrigeStr();

exameItemRepository.corrigeStr();

laboratorioRepository.corrigeStr();

pedidoResultadoRepository.corrigeStr();

areaRepository.corrigeStr();

areaFamiliaRepository.corrigeStr();

areaMicroRepository.corrigeStr();

atendeEncaminhamentoRepository.corrigeStr();

atendeGestanteRepository.corrigeStr();

atendeHiperdiaRepository.corrigeStr();

atendeInternacaoRepository.corrigeStr();

<a href="//atendeMedicoRepository.corrigeStr">//atendeMedicoRepository.corrigeStr</a>();

atendePreConsultaRepository.corrigeStr();

<a href="//faturamentoRepository.corrigeStr">//faturamentoRepository.corrigeStr</a>();

gestanteRepository.corrigeStr();

hanseniaseRepository.corrigeStr();

hiperDiaRepository.corrigeStr();

tuberculoseRepository.corrigeStr();

empresaRepository.corrigeStr();

<a href="//mensagemRepository.corrigeStr">//mensagemRepository.corrigeStr</a>();

beneficioGestorRepository.corrigeStr();

eventoRepository.corrigeStr();

programaRepository.corrigeStr();

programaCadastroRepository.corrigeStr();

programaEsperaRepository.corrigeStr();

projetoRepository.corrigeStr();

visitaSocialRepository.corrigeStr();

linhaRepository.corrigeStr();

notificacaoRepository.corrigeStr();

roteiroPessoaRepository.corrigeStr();

transporteRepository.corrigeStr();

transporteHistoricoRepository.corrigeStr();

transporteMotoristaRepository.corrigeStr();

transporteVeiculoRepository.corrigeStr();

viagemRepository.corrigeStr();

viagemPessoaRepository.corrigeStr();

atendimentoVigilanciaRepository.corrigeStr();

<a href="//atendimentoVigilanciaDenunciaRepository.corrigeStr">//atendimentoVigilanciaDenunciaRepository.corrigeStr</a>();

denunciaRepository.corrigeStr();

faturamentoVigilanciaRepository.corrigeStr();

}
dentro de cada sub-método executo uma consulta, e nessa consulta(lista) faço um merge.

em algum determinado momento nao especifico ele acontece o seguinte erro:

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction

at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)

at br.com.tdrinfo.control.MyJpaTransactionManager.doCommit(MyJpaTransactionManager.java:21)

at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)

at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)

at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)

at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)

at $Proxy333.fieldTEXT(Unknown Source)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:418)

at flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:183)

at flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1400)

at flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:1005)

at flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:103)

at flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158)

at flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44)

at flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67)

at flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:166)

at flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:291)

at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:353)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at com.planetj.servlet.filter.compression.CompressingFilter.doFilter(CompressingFilter.java:270)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:83)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

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:224)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)

at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:269)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)

at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1773)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:662)

o q pode ser ???

4 Respostas

L

Cara, você postou o stacktrace todo? Verifique se ainda tem algo faltando ai no stacktrace e poste ai pois se tiver um’caused by…’ precisamos avaliar isso pra ver o que de fato ta ocorrendo.

Isso ta ocorrendo, logicamente, por que ocorreu algum erro nas operações no banco e a transação ta falhando. So que não ta aparecendo o real motivo do problema ai para que possamos corrigir pq algum catch da vida capturou e lançou outra exceptiona por cima e ta mascarando o real problema que ta causando isso.

Caso nao tenha nada mais no stacktrace faça o seguinte.

Não sei qual provider JPA que ta usando mas de acordo com o provider que tiver usando faça o abaixo:

  • Se tiver usando hibernate
    Va até a classe org.hibernate.ejb.TransactionImpl e no método commit coloque um breakpoint na linha abaixo
  • Se estiver usando openjpa
    Va até a classe org.apache.openjpa.persistence.EntityManagerImpl e no método commit coloque um breakpoint na linha abaixo

Agora suba a aplicação em modo debug. Quando parar na linha com o breakpoint faça de um ‘step into’ (pressione F5 no eclipse) para continuar a execução entrando no método onde o breakpoint está parado. Quando você entrar no método va dando ‘step over’ (F6 no eclipse) e va descendo e executando as linhas de código, vai chegar em um determiado momento que vai estourar uma exception e algum catch vai captura-la. É neste momento que você vai ter a real causa do problema. Então você neste ponto em modo debug inspeciona a variavel da exception e ver qual a msg de erro que ta ocorrendo, pode ser uma violação de restrição de banco, chave duplicada, etc… qualquer coisa, mas com esse motivo vc entende o por que da transação ta falhando.

O que acontece é que vc quando ver a exception de falha na transação só ta vendo que foi efetuado o rollback e que a transação falhou mas nao ta vendo, neste caso, o real motivo.

Por isso, verifique se no stacktrace tem mais coisa e se tem um ‘caused by’ ou algo assim. Se tiver mais coisa posta ai pra gente.

Mas se nao tiver vc vai ter que entrar e debugar la dentro do provider jpa que ta usando para descobrir o que de fato ta ocorrendo.

Espero ter ajudado.

L

Só mais uma coisa, esse seu método ta gigantesco e dificil de ler e pouco legível. Pense seriamente numa refatoração do mesmo.

B

Use a tag Code para postar o código.

M

E ae conseguiu resolver estou com um problema parecido

Criado 13 de março de 2012
Ultima resposta 25 de jun. de 2012
Respostas 4
Participantes 4