2015-04-29 4 views
0

Аннотации @Transactional не отбрасывают первую вставку при неудачном выполнении второго обновления (с номером RuntimeException). Исключение запускается в updateNumeroVotos, но Spring не откатывает вставку операции сохранения. Любая идея?Отметка весны @Transactional не откатывается

У меня есть эти файлы:

IdeaService.java код:

@Service 
public class IdeasServiceImpl implements IdeasService { 

@Autowired 
all daos code 

/** 
* Metodo que inserta un voto de un usuario 
*/ 
@Override 
@Transactional(propagation = Propagation.REQUIRED) 
public void incorporarVoto(String token, Integer id) throws Exception { 
    IdeaVotoVO ideaVoto = new IdeaVotoVO(); 

    ideaVoto.setUsuario(usuariosService.getDatosTokenUsuario(token).getLoginCiudadano()); 
    ideaVoto.setIdIdea(id); 
    ideaVoto.setVoto(ConstantesModel.IDEA_VOTO_POSITIVO); 

    if (validarVoto(ideaVoto)) { 
     ideaVotoDAO.save(ideaVoto);   
     ideaDatosDao.updateNumeroVotos(new Timestamp(Generic.getFechaActual()), id); 
    } 

} 

applicationContext.xml

<mvc:annotation-driven /> 
<mvc:default-servlet-handler /> 

<context:component-scan base-package="example.code.xxxx.*" /> 

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> 

    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
    <property name="url" value="jdbc:oracle:thin:@ora11g:1521:xxxxxx" /> 
    <property name="username" value="xxxxxx" /> 
    <property name="password" value="yyyyy" /> 
    <property name="validationQuery" value="SELECT SYSDATE FROM DUAL" /> 
    <property name="maxIdle" value="3" /> 
    <property name="poolPreparedStatements" value="true" /> 
    <property name="maxOpenPreparedStatements" value="100" /> 
    <property name="maxWaitMillis" value="10000" /> 
    <property name="maxTotal" value="20" /> 
</bean> 

<bean id="sessionFactoryCiud" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">validate</prop> 
     </props> 
    </property> 
    <property name="mappingResources"> 
     <list> 
      <<--Here de entity's--> 
     </list> 
    </property> 
</bean> 



<cache:annotation-driven /> 
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> 
    <property name="cacheManager" ref="ehcache" /> 
</bean> 

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 
    p:config-location="classpath:ehcache.xml" /> 


<bean id="TransactionManagerCiud" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactoryCiud" /> 
    <qualifier value="ciudada" /> 
</bean> 


<tx:annotation-driven transaction-manager="TransactionManagerCiud" proxy-target-class="true"/> 



<bean id="ideasService" 
    class="example.code.xxxx.service.ideas.impl.IdeasServiceImpl"> 
</bean> 



<bean id="IdeaVotoDAO" 
    class="example.code.xxxx.model.ideas.impl.IdeaVotoDAOImpl"> 
    <property name="sessionFactory" ref="sessionFactoryCiudadania" /> 
</bean> 

<bean id="IdeaDatosDAO" 
    class="example.code.xxxx.model.ideas.impl.IdeaDatosDAOImpl"> 
    <property name="sessionFactory" ref="sessionFactoryCiud" /> 
</bean> 
</beans> 

Я пытался добавить эти строки, но не работают

<tx:advice id="txAdvice" transaction-manager="txManager"> 
    <tx:attributes> 
    <tx:method name="*" rollback-for="Exception"/> 
    </tx:attributes> 
</tx:advice> 
+0

Имеет ' ideaVotoDAO'any '@ Транзакционные аннотации? – xerx593

+0

Нет, у них нет ¿Это необходимо? – MickeyBG

+0

По умолчанию Spring отбрасывает только 'RuntimeException'. (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html#transaction-declarative-rolling-back). Какое «Исключение» делает ваш метод? Это может быть также причиной не включения '@ EnableTransactionManagement' в конфигурацию (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html#tx-decl-explained). –

ответ

3

Тогда, пожалуйста, добавьте:

rollbackFor = Exception.class 

к вашему @Transactional аннотацию.


EDIT:

Если вы не хотите редактировать каждый из ваших @Transactional annotatinos, пожалуйста, смотрите на this interesting approach.

С самого начала хороший дизайн был бы, если бы (все) ваши службы выбрасывали (настраиваемый тип) RuntimeException, когда что-то происходит откат. (Но это кажется более сложным, чем изменения всех аннотаций.)

+0

Да, я пробовал это, и он работает, но это «общий способ» сделать это для всех методов @transational и не писать эту анотацию? – MickeyBG

+0

Я сделал редактирование, но Габор ударил его! ;) – xerx593

+0

Я пробовал, но не работает ..... Я закончил оригинальное сообщение с этим – MickeyBG

1

Вы можете предоставить tx:advice с для менеджеров транзакций, как это:

<tx:advice id="txAdvice" transaction-manager="txManager"> 
    <tx:attributes> 
    <tx:method name="*" rollback-for="Exception"/> 
    </tx:attributes> 
</tx:advice> 

(., Как описано в documentation)

+0

Я пробовал, но не работает .....Я закончил исходное сообщение с этим – MickeyBG

0

Что такое " sessionFactoryCiudadania ", используемый« ideaVotoDao »и почему он отличается от SessionFactory, используемого вашим менеджером транзакций? Аннотации будут только возвращать содержимое из сеанса, который он создал .... Если DAO использует другой сеанс внутри себя, он собирается совершать на основе своих собственных правил (что, вероятно, означает базовый режим autoCommit.)

+0

Я исправлю это. Я сделал ошибку, исправляя код для вопроса. В настоящее время все в порядке? – MickeyBG

Смежные вопросы