我正在使用Spring的事务管理器,我的问题是它不会在预期的异常上回滚事务。我有一个用户域,其中有一个职责列表(另一个域责任,1:N
关系),我首先插入用户,然后是所有职责。以下是代码的一部分:
@Override
@Transactional(rollbackFor = { PersistenceException.class })
public User create(User user) throws PersistenceException {
//some code to insert the user using jdbcTemplate without calling other self-written methods
insert(user);
// some code to insert the responsibilities for that user in a separate methode without @Transactional annotation, which raises a PersistenceException
insertResponsibilities(user.getResponsibilities());
}
这是我的应用程序配置文件(仅与交易相关的信息):
<tx:annotation-driven transaction-manager="txManager" />
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
我的测试方法:
@Test()
public void testCreate() {
int initSize = dao.findAllUsers();
// Create an user with valid user data but invalid responsibilities
User user = new User(...);
try {
dao.create(user);
} catch (PersistenceException e) {
assertTrue(dao.findAllUsers()==initSize);
}
}
此断言为false
,表示实际上正在添加用户。 insertResponsibilities
方法抛出PersistenceException
(它在测试方法中被捕获),但整个事务不会像测试方法那样回滚。
我的技术堆栈还包括JdbcTemplate和HSQLDB作为DB(我通常在嵌入式数据库上进行测试,但也尝试使用实际的数据库,但仍然无法正常工作)。我尝试用@Transactional标记方法insertResponsibilities,但没有帮助。
修改 测试类声明:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:testctx.xml" })
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class UserTest {...}
在testctx.xml中,我只是指定使用嵌入式数据库并运行一些测试插入。