我介紹了一個問題「春季交易失敗回滾」。我有一個服務類,它調用2個DAO將數據插入到數據庫表中。春季交易失敗回滾
emTrcvLineDAO.create(lineVo)無法插入表中,因爲lineVo缺少一些必填字段,但emTrcvHeaderDAO.create(vo)失敗回滾並且數據仍然成功插入到數據庫中。我想知道爲什麼它不會因爲兩個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>
我的服務和DAO定義如下:
<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(lineVo)失敗並引發org.springframework.dao.DataIntegrityViolationException ,但實際上emTrcvHeaderDAO.create(VO)不會回退和VO數據仍然可以插入D B。爲什麼? – runboy2000
saveEmTrcvHeader()是emTrcvHeaderService服務bean的一種方法。 – runboy2000
哇...這是非常古老的配置,我真的希望這不是你正在使用它的新東西。沒有看到你的tx管理器配置和dao實現以及你正在使用哪個hibernate版本的解釋,任何答案都只是一個猜測。您也無法解釋哪個數據庫(以及您正在使用的表類型)。 –