Hibernate + JUnit多线程集成测试



我在JUnit中使用Hibernate和Spring进行集成。我使用多次读写来测试我的代码是否正确处理并发性。Hibernate的问题是我不能单独使用多线程来模拟。Hibernate抱怨没有活动的Hibernate会话绑定到dao。因此,我所做的工作是在线程中执行Hibernate的TransactionTemplate中的dao的方法,例如

   Thread alpha = new Thread(new Runnable() {
            @Override
            public void run() {
                TransactionTemplate tt = new TransactionTemplate(tm);
                tt.execute(new TransactionCallbackWithoutResult() {
                    @Override
                    public void doInTransactionWithoutResult(TransactionStatus status) {
                        Address address =addrDao.findBy("John Doe");
                        address.setZipCode("12345");
                        addrDao.update(address);
                    }
                });
            }
        });
创建另一个线程,beta,具有相同的内容,但有额外的时间延迟。最后,启动两个线程,
    alpha.start();
    beta.start();

它工作。我的问题,有没有更好的方法来做到这一点,而不是使用TransactionTemplate(…)在一个Spring+Hibernate+Junit设置?

另外,我发现即使在测试用例的开始处包含了 @TransactionConfiguration(defaultRollback = true) ,该操作也不能在测试结束时回滚。

谢谢

true添加以下代码到您的测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration("classpath:application-context.xml")
@TransactionConfiguration(defaultRollback=true)

和下面一行到application-context.xml

<tx:annotation-driven/>

您可以删除测试代码中的显式事务处理。

最新更新