Olá a todos.
Estou usando o hibernate e o spring em uma aplicação web. O controle de transação fica por conta do Spring, porém estou tendo um grande problema com isso, pois não consigo controlar o momento de fazer o commit, ele faz quando dá vontade e eu não sei quando é esse momento. O problema que estou tendo é o seguinte:
Tenho alguns registros no banco e cada registro desse possui um Set que são registros de outra tabela. Em um determinado local do código, eu itero sobre os registros e para cada registro eu limpo o set e mando salvar. O problema é que às vezes ele decide não limpar os dados no banco. Quando ele não limpa, dá a seguinte exception:
16:39:02,492 ERROR [STDERR] org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access; nested exception is org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
16:39:02,492 ERROR [STDERR] Caused by:
16:39:02,493 ERROR [STDERR] org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.springframework.orm.hibernate3.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:126)
at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:48)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:821)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:637)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:624)
at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:340)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:111)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:176)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:616)
at br.com.cpqd.dsng.vas.gerente.agendamento.business.AgendamentoColetaService$$EnhancerByCGLIB$$1b1b8d.execStoredsProcedures(<generated>)
at br.com.cpqd.dsng.vas.gerente.agendamento.business.JobColetaSumarizacao.execute(JobColetaSumarizacao.java:87)
at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 update controle_sumarizacao_relatorios set data=2008-02-26 16:39:02.366000 -03:00:00, tabela_base=tab_dados_10315_variaveis, tipo_er=0 where nome=nome_teste foi abortada. Chame getNextException para ver a causa.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2530)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1317)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2592)
at org.jboss.resource.adapter.jdbc.WrappedStatement.executeBatch(WrappedStatement.java:519)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
Tentei debugar o código e mesmo quando ele limpa os dados, ele só faz isso depois que o método termina de ser executado, ou seja, dentro do loop ele não mexe em nada no banco, mesmo tendo mandado atualizar.
No applicationcontext.xml a transação está assim
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="java:/TransactionManager"/>
</bean>
Se alguém tiver qualquer dica, será bem-vinda.
Obrigado
