Saudações,
Estou a alguns dias me batendo com alguns problemas com a parte de transações com o banco de dados. Utilizo o Spring, Maven e o Glassfish como local container. Na execução de um dos meus serviços preciso inserir/alterar registros em várias tabelas distintas e quando ocorre algum erro ao executar algum dos comandos preciso que seja feito o rollback de todas as alterações executado. Utilizo a seguinte anotação do Spring “@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)” para que ele faça isso de forma automática.
Esse comando funciona perfeitamente utilizando o banco de dados MySql ou Firebird, mas quando utilizo no Oracle não funciona!
Debugando o meu serviço vejo que a cada insert executado é feito um commit, vai direto para o banco de dados e não apenas ao finalizar o método, que seria a forma correta como funciona nos outros banco de dados. Pesquisei na internet descobri que existe a propriedade do hibernate chamada “hibernate.connection.autocommit” mas mesmo setando o valor como “false” para ela nada funciona (defini esse valor direto no arquivo “persistence.xml” e no “applicationContext.xml” na configuração do EntityManagerFactory, e em nenhum dos casos tive sucesso).
A configuração do Spring é a mesma para todos os banco de dados, o projeto é o mesmo e tudo funciona normalmente alterando o banco de dados, somente o controle das transações que não, pois aparentemente o Oracle não respeita a propriedade autocommit. É isso mesmo, o Oracle não respeita essa propriedade? Alguem tem uma ídea do que pode ser? Já tentei atualizar o driver OJDBC para a versão 14 mas o erro permanece.
Utilizo GlassFish 3.1.2, Oracle 11g, ojdbc6.jar, Hibernate 4.1.0, Spring 3.1.1.
Método do serviço:
[code]@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public Entidade save(Entidade entidade) throws ServiceException {
try {
entidade = entidadeData.save(entidade);
outroService2.update(entidade.getCampo1(), entidade.getCampo2(), entidade.getCampo3());
atualizaOutroCampoEntidade(entidade);
return entidade;
} catch (Exception e) {
logger.error("Erro ao salvar entidade", e);
throw new ServiceException(e.getMessage());
}
}[/code]
Arquivo “applicationContext.xml”:
[code]<?xml version="1.0" encoding="UTF-8"?>
<context:annotation-config/>
<context:component-scan base-package="br.com.sistema.*"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="persistenceJpa"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="false"/>
</bean>
</property>
<property name="jpaPropertyMap">
<map>
<entry key="hibernate.connection.autocommit" value="false" />
<entry key="hibernate.connection.release_mode" value="after_transaction"/>
</map>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:jta-transaction-manager/>
<tx:annotation-driven transaction-manager="transactionManager"/>
<jpa:repositories base-package="br.com.sistema.data" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
[/code]
Arquivo “persistence.xml”:
[code]<?xml version="1.0" encoding="UTF-8"?>
org.hibernate.ejb.HibernatePersistence
jdbc/sistema
xxxxx
<!--Na documentação do Hibernate 4.1 diz que pro 11G utiliza o mesmo dialeto do 10G -->
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.jdbc.batch_size" value="0"/>
<property name="hibernate.connection.charSet" value="WE8ISO8859P1"/>
<property name="hibernate.connection.useUnicode" value="true"/>
</properties>
[/code]