Qualquer exeção, fazer rollback (Spring)

2 respostas
Deluxe

Pessoal
como configurar o spring para fazer rollback em qualquer exeção que causar nos métodos de crud?

<!-- Configuração das transações --> <tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <!-- Configurações de transação --> <tx:attributes> <!-- Todos os métodos que começam com "select" são read-only --> <tx:method name="get*" propagation="SUPPORTS" read-only="true" rollback-for="java.lang.Exception"/> <!-- Os outros métodos requerem transação --> <tx:method name="save" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="update" propagation="REQUIRED" rollback-for="java.lang.Exception"/> </tx:attributes> </tx:advice>

eu fiz assim
simulei uma exeção no método save,
mas não fez rollback

meu método save é esse

@SuppressWarnings("unchecked") public PK save(Tipo novoObj) throws PersistenceException { try { return (PK) getHibernateTemplate().save(novoObj); } catch (Exception e) { logger.error("Error:",e); throw new PersistenceException(e); } }

Eu simulei um erro de não aceitar um campo nullo.
então eu enviei para salvar um objeto com uma coleção nulla dentro dele.
ele salva o objeto, quando vai salvar a coleção, acontece uma exeção de campo not-null,
mas não faz rollback no objeto que ele inseriu…

tem outra forma? ou assim está errado

2 Respostas

B

A classe que possui o método save é um bean do Spring? Qual gerente de transação você está utilizando?

Note que o Spring só executa o rollback para exceções não checadas, ou seja, que implementam RuntimeException. O que pode estar acontecendo é ele estar levando em consideração a Exception lançada pelo save e não a PersistenceException. Dê uma olhada na documentação.

Deluxe

ae cara
nao entendi muito bem
mais vamo la

meu xml é esse

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">


    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
		<property name="annotatedClasses">
	      <list>
	      	<value>br.gov.in.assinatura.pojo.Pessoa</value>
	      	<value>br.gov.in.assinatura.pojo.CachorroPessoa</value>
	      	<value>br.gov.in.assinatura.pojo.RacaoCachorro</value>
	      </list>
	    </property>
		
        <property name="hibernateProperties">
	        <props>
	            <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> 
	            <prop key="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</prop>
	            <prop key="hibernate.show_sql">true</prop>
	            <prop key="hibernate.format_sql">true</prop>      
	        </props>
        </property>
    </bean>
    
    
     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>  

  	    <!-- Configuração das transações -->  
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
         <!-- Configurações de transação -->  
         <tx:attributes>  
             <!-- Todos os métodos que começam com "select" são read-only -->  
             <tx:method name="get*" propagation="SUPPORTS" read-only="true" rollback-for="java.lang.Exception"/>  
             <!-- Os outros métodos requerem transação -->  
             <tx:method name="save" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
             <tx:method name="update" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
         </tx:attributes>  
     </tx:advice>   


<bean name="/logon/logon" class="br.gov.in.assinatura.modulo.logon.apresentacao.LogonAction">
       <property name="pessoaFacade" ref="pessoaFacade"></property>
     </bean>
        
        
                
         <bean id="pessoaFacade" class="br.gov.in.assinatura.modulo.logon.apresentacao.PessoaFacade">
    	        <property name="pessoaDao">
    	        	<bean id="pessoaDao" class="br.gov.in.assinatura.modulo.logon.apresentacao.PessoaDaoImpl">
    	        		<property name="sessionFactory" ref="sessionFactory"/>
    	        	</bean>
    	        </property>  	        	  	              		      	
         </bean>

</beans>

esse método save meu fica em uma classe que extends a HibernateDaoSupport

Criado 31 de agosto de 2009
Ultima resposta 31 de ago. de 2009
Respostas 2
Participantes 2