Spring的事务管理不能正常工作@Transactional

时间:2014-05-23 11:17:35

标签: java spring transactions hsqldb jdbctemplate

我正在使用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中,我只是指定使用嵌入式数据库并运行一些测试插入。

0 个答案:

没有答案