Transação com Spring

2 respostas
spranta

Olá pessoal, estou iniciando no Spring e coloquei o controle de transação inicialmente no DAO, só para testes

try {
			EntityTransaction tx = gerenciador.getTransaction();	    	
	    	tx.begin();			
			gerenciador.persist(object);
        	tx.commit();
		} catch (final PersistenceException ex) {
           ex.printStackTrace();
        }

Dai, que li que o Spring na realidade pode gerenciar de forma transparente todo este controle de transação de forma que o metodo acima ficaria sendo somente:

Entao, lá fui eu tentar implementar controle de transação pelo spring, e para isso eu fiz as devidas configurações:

<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="dbControleAcesso" />
	</bean>
	
	<!-- Classe responsável pela gestão das transacções (injectada) -->
	<bean id="transactionManager"
		class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory"
			ref="entityManagerFactory" />
	</bean>

	<bean id="uc" abstract="true"
		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager">
        	<ref bean="transactionManager" />
		</property>
		<property name="target" ref="dao"/>
        <property name="transactionAttributes">
        	<props>
        		<prop key="insert*">PROPAGATION_REQUIRED</prop>
			</props>
		</property>
	</bean>
	 
	
	<!-- Habilita o gerenciamento de transações atravéz da anotação @Transactional -->
	 <tx:annotation-driven transaction-manager="transactionManager" />

     <bean id="dao" class="com.mcp.controleAcesso.dao.base.JpaDAO" >  
       <property name="entityManagerFactory" ref="entityManagerFactory"/>  
     </bean>

Enfim, pelo que li isso ai em cima tá tudo certo, na execução não dá erro nenhum, no entanto, não grava no banco de jeito nenhum, só do jeito antigo é que gravava, onde eu explicitamente chamava o commit.
Já tentei anotar a classe, e como podem ver tambem tenter declarar claramente qual era a classe e o respectivo metodo pelo TransactionProxyFactoryBean, mas o commit nunca é dado.
Alguém sabe então me dizer o que está faltando, o trem que já me quebrou a cabeça.

2 Respostas

spranta

Alguém pra me socorrer?

Matheus_Tardivo

Algumas observações que podem ajudar:

  • Você deve usar a anotação @Transactional na sua classe;
  • O bean “uc” não é necessário;
  • Você não precisa injetar o entityManagerFactory no seu DAO pelas propriedades do bean no xml, use a anotação @PersistenceContext no EntityManager do DAO;

Segue um exemplo completo: http://struts.apache.org/2.x/docs/struts-2-spring-2-jpa-ajax.html
Preste atenção nos arquivos:

  • PersonServiceImpl.java
  • applicationContext.xml
Criado 12 de setembro de 2007
Ultima resposta 13 de set. de 2007
Respostas 2
Participantes 2