Java 冬眠+;JUnit多线程集成测试

Java 冬眠+;JUnit多线程集成测试,java,spring,hibernate,junit,Java,Spring,Hibernate,Junit,我在JUnit中使用Hibernate和Spring进行集成。如果代码正确处理并发性,我将使用多次读写来测试代码。Hibernate的问题是我不能单独使用多线程来模拟它。Hibernate抱怨没有绑定到DAOs的活动Hibernate会话。所以,我所做的是在Hibernate的TransactionTemplate中的线程中执行DAOs的方法 Thread alpha = new Thread(new Runnable() { @Override

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

   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();
成功了。我的问题是,除了在Spring+Hibernate+Junit设置中使用TransactionTemplate(…)之外,还有其他更好的方法吗

此外,我发现即使我在测试用例的开头包含了
@TransactionConfiguration(defaultRollback=true)
,操作也无法在测试结束时回滚


谢谢

True将以下内容添加到您的测试课程中:

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration("classpath:application-context.xml")
@TransactionConfiguration(defaultRollback=true)
下面一行是您的application-context.xml

<tx:annotation-driven/>


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

是的,我在测试类中添加了所有这些。只有当您的测试是单线程时,这些选项才有效。默认情况下,defaultRollback=true。注解
@TransactionConfiguration
不够高,您找到解决方案了吗?