2016-11-06 4 views
1

Я поднимаю вопрос «Откат отката пружины». У меня есть класс обслуживания, который вызывает 2 DAO для вставки данных в таблицу DB.Откат неудачных транзакций весны

emTrcvLineDAO.create (lineVo) не удается вставить в таблицу как строку, в которой отсутствуют некоторые обязательные поля, но emTrcvHeaderDAO.create (vo) откаты отката и данные, все еще вставленные в DB успешно. Мне интересно, почему он не откатывается, поскольку два DAO находятся в одной транзакции.

У всех парней есть идея по этому поводу? Заранее спасибо.

public void saveEmTrcvHeader(List<EmTrcvHeaderVOImpl> voList, List<ResponseItem> responseItemList) { 

     for (EmTrcvHeaderVOImpl vo : voList) { 
      emTrcvHeaderDAO.create(vo); 
      List<EmTrcvLineVOImpl> lineList = vo.getLineList(); 
      for (int i = 0; i < lineList.size(); i++) { 
       EmTrcvLineVOImpl lineVo = lineList.get(i); 
       lineVo.setEmTrcvHeaderId(vo.getEmTrcvHeaderId()); 
       lineVo.setProjId(null); 
       emTrcvLineDAO.create(lineVo); 

      }  

     }  

} 

Моя конфигурация транзакции:

<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
    <property name="transactionManager"> 
     <ref bean="transactionManager" /> 
    </property> 
    <property name="proxyTargetClass"> 
     <value>true</value> 
    </property> 
    <property name="transactionAttributes"> 
     <props>    
      <prop key="save*">PROPAGATION_REQUIRED,-java.lang.Exception,-org.springframework.dao.DataAccessException</prop>  
      <prop key="*">PROPAGATION_REQUIRED,-java.lang.Exception,-org.springframework.dao.DataAccessException</prop> 
     </props> 
    </property> 
</bean> 

Моя служба и дао определяется следующим образом:

<bean name="emTrcvHeaderService" parent="txProxyTemplate"> 
    <property name="target"> 
     <bean class="com.emtrcv.service.EmTrcvHeaderService"> 
     <property name="emTrcvHeaderDAO"> 
      <ref bean="emTrcvHeaderDAO"/> 
     </property> 
     <property name="emTrcvPubSelectIdsDAO"> 
      <ref bean="emTrcvPubSelectIdsDAO"/> 
     </property> 
     <property name="emTrcvLineDAO"> 
      <ref bean="emTrcvLineDAO"/> 
     </property> 
     </bean> 
    </property> 
    </bean> 
    <bean name="emTrcvHeaderDAO" class="com.emtrcv.dao.EmTrcvHeaderDAOImpl"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 
    <bean name="emTrcvPubSelectIdsDAO" class="com.emtrcv.dao.EmTrcvPubSelectIdsDAOImpl"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 
    <bean name="emTrcvLineDAO" class="com.emtrcv.dao.EmTrcvLineDAOImpl"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 
+0

emTrcvHeaderDAO.create (VO) следует rollack в emTrcvLineDAO.create (Линево) не бросайте и org.springframework.dao.DataIntegrityViolationException , но на самом деле emTrcvHeaderDAO.create (VO) не откатить и данные VO еще быть вставлен в DB. Зачем? – runboy2000

+0

saveEmTrcvHeader() является одним из методов сервисного компонента emTrcvHeaderService. – runboy2000

+0

Ничего себе ... это довольно старая конфигурация, я действительно надеюсь, что это не что-то новое, что вы используете. Не видя конфигурацию вашего tx-менеджера и dao-реализации и объясняя, в какой версии спящего режима вы используете, любой ответ - это всего лишь предположение. Вы также не можете объяснить, какая база данных (и, возможно, типы таблиц, которые вы используете). –

ответ

0

Я думаю, вы должны упомянуть, когда откат должен иметь место. В соответствии с doc, Принцип правил отката важен: они позволяют указать, какие исключения (и броски) должны приводить к автоматическому откату. Вы указываете это декларативно, в конфигурации, а не в коде Java. Таким образом, хотя вы все еще можете вызвать setRollbackOnly() для объекта TransactionStatus для отката текущей транзакции, чаще всего вы можете указать правило, которое MyApplicationException всегда должно приводить к откату.

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html Пожалуйста, обратитесь для получения более подробной информации

+0

Я уже объявляю, что транзакция должна быть откат, если исключение выбрано в определении «txProxyTemplate». emTrcvLineDAO.create (lineVo) должен выдавать исключение, поскольку данные lineVo пропускают некоторые обязательные поля таблицы DB. однако «emTrcvHeaderDAO.create (vo)« все еще может успешно сохранять данные в БД, даже emTrcvLineDAO.create (lineVo) генерирует DataIntegrityViolationException. – runboy2000

0

Наконец я нашел причину. есть два дублирующих файла конфигурации Spring, которые определяют правила управления транзакциями в проекте, поэтому управление весенними трафаретами не работает. После удаления одного из них он работает.

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