【发布时间】:2017-03-03 14:01:42
【问题描述】:
我有这样的事情:
@Service
@Transactional
public class ServiceA {
@Autowired
SomeDAO1 dao1;
@Autowired
ServiceB serviceB;
public void methodServiceA() {
serviceB.someMethodThatRunsInsertIntoDB();
dao1.anotherMethodThatRunsInsertIntoDB();
}
}
@Service
@Transactional
public class ServiceB {
@Autowired
Dao2 dao2;
public void someMethodThatRunsInsertIntoDB() {
dao2.insertXXX();
}
}
我的问题是:如果serviceB.someMethodThatRunsInsertIntoDB() 执行成功但dao1.anotherMethodThatRunsInsertIntoDB() 抛出异常,serviceB 所做的更改不会回滚。如果dao1.anotherMethodThatRunsInsertIntoDB() 发生异常,我需要回滚这些更改。我该怎么做?
// 已编辑
spring-servlet.xml中的事务配置
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
</bean>
如果一个 dao 使用 EntityManager 而另一个 dao 使用 JdbcTemplate 与 DB 交互,这是否相关?
//更新 -- EntityManager 配置
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
</bean>
</property>
【问题讨论】:
-
除非您在 dao 方法中吞下异常,否则此代码应该可以工作。请添加您如何调用服务方法以及如何设置事务管理器。
-
能否提供您的 Spring xml 配置文件?
-
我编辑了帖子以添加事务xml配置。
-
添加您的事务管理器配置,向您展示 JdbcTemplate 的使用。数据源配置和实体管理器配置。
标签: java spring rollback spring-transactions