Я поднимаю вопрос «Откат отката пружины». У меня есть класс обслуживания, который вызывает 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>
emTrcvHeaderDAO.create (VO) следует rollack в emTrcvLineDAO.create (Линево) не бросайте и org.springframework.dao.DataIntegrityViolationException , но на самом деле emTrcvHeaderDAO.create (VO) не откатить и данные VO еще быть вставлен в DB. Зачем? – runboy2000
saveEmTrcvHeader() является одним из методов сервисного компонента emTrcvHeaderService. – runboy2000
Ничего себе ... это довольно старая конфигурация, я действительно надеюсь, что это не что-то новое, что вы используете. Не видя конфигурацию вашего tx-менеджера и dao-реализации и объясняя, в какой версии спящего режима вы используете, любой ответ - это всего лишь предположение. Вы также не можете объяснить, какая база данных (и, возможно, типы таблиц, которые вы используете). –