该项目使用Spring和Hibernate。
我正在尝试同时测试还执行某些Hibernate查询的服务。我要做的是创建许多调用这些服务的任务,并将它们放在固定线程执行器中,这些执行器将并行运行它们。
持久层与Hibernate的SessionFactory(org.hibernate.SessionFactory)一起使用,因此例如,这就是我读取实体的方式:
MyEntity entity = sessionFactory.getCurrentSession().get(MyEntity.class, id);
这是我的测试配置方式:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:test-bundle-context.xml")
@Transactional()
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SomeTest {
@Test
public void profileSearchVerifySort() {
// Do something
}
}
我遇到的问题是,当从测试方法调用该服务并因此在主线程中运行时,它都能按预期运行,但是从ThreadPool线程调用时,我得到“ 无法获取事务” -当前线程的同步会话”。
我还尝试过手动创建这样的事务:
TransactionTemplate tmpl = new TransactionTemplate(txManager);
tmpl.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
myService.soStuff();
sessionFactory.getCurrentSession().flush();
sessionFactory.getCache().evictAll();
}
});
它处理交易问题。但是然后我又遇到了另一个问题,那就是我正在创建的事务似乎没有完成,并且在执行了上面的代码之后,在同一测试方法中,对实体的更新不可见。我不确定如何强制执行事务,因为我没有对此的引用。
总的来说,我们如何在线程中执行Hibernate代码,以便创建并提交事务?