Rollback spring

5 respostas
Deluxe

Pessoal
eu fiz o seguinte teste

enviei um objeto com uma coleção dentro dele para ser salvo no banco, até ai tudo bem,
o hibernate entro em ação, e salvo o objeto primeiro, e depois foi salvar a coleção dentro dele,
ocorreu um erro no banco quando foi ser salvo a coleção, o Spring não deveria fazer o rollback no objeto ? Por que ele não fez, ele inseriu no banco o objeto.

esse é uma parte do arquivo de configuração do spring

<?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:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource">
        	<ref bean="dataSourceExemplo"/>
        </property>        

		<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>
	            <prop key="hibernate.jdbc.batch_size">0</prop>
	            <prop key="connection.autocommit">true</prop>            
	        </props>
        </property>
    </bean>
    
    
    <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="transactionAttributes">
            <props>
            	<prop key="add*">PROPAGATION_REQUIRED </prop>
        		<prop key="delete*">PROPAGATION_REQUIRED </prop>
       	 		<prop key="update*">PROPAGATION_REQUIRED </prop>
        		<prop key="save*">PROPAGATION_REQUIRED </prop>
       			<prop key="get*">ROPAGATION_SUPPORTS,readOnly</prop> 
            </props>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>  
    
</beans>

Pelo que eu andei lendo, ele faz rollback a parti da exeção que é lançada, aonde eu configuro o rollback aqui?

vlw

5 Respostas

L

Qual a exceção lançada?

O Spring só da rollback para RuntimeExceptions, não para Exceptions checadas. E também não é boa prática colocar “throws Exceptions” em toda assinatura de método, pois esconde possíveis problemas.

Deluxe

eu simulei inserir uma coleção que está com o nome null,
e o banco nao aceita null

ai ele lança uma SQLException

L

Deluxe:
eu simulei inserir uma coleção que está com o nome null,
e o banco nao aceita null

ai ele lança uma SQLException

Então, SQLException é exceção checada, o Spring não vai dar rollback mesmo. O que você deve fazer é tratar essa exceção no método que a lançou e relançar uma nova exceção de runtime mais genérica. Aí sim, vai funcionar.

Deluxe

quando eu starto a aplicação
aparece

Deleted entity synthetic identifier rollback: disabled

tem alguma coisa haver?

Deluxe
<!-- Configuração das transações -->  
    <tx:advice id="transactionAdvice">  
         <!-- 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:attributes>  
     </tx:advice>

atualiza o spring e estou usando assim agora
porem o rollback nao faz

ele ainda continua inserindo o objeto pai
e quando vai inserir sua coleção, ele da o erro que eu programei,
mas nao faz rollback no objeto pai

Criado 28 de agosto de 2009
Ultima resposta 28 de ago. de 2009
Respostas 5
Participantes 2