我正在使用 Spring 管理的休眠事务
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="SessionFactory" />
</bean>
我有一个实现 Runnable 的任务类,它调用一个用@Transactional 注释的方法。该方法使用休眠条件查询 api 返回一些结果。
class Task implements Runnable {
public void run() {
helperDao.getResults();
}
}
class HelperDao {
@Transactional
public List<?> getResults() {
return this.sessionFactory.getCurrentSession().createCriteria(Model.class).list();
}
}
我有一个带有自动装配实例的 junit4 测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/test.xml")
@TransactionConfiguration(transactionManager = "transactionManager")
@Transactional
public class TaskTest {
public void testTask() {
Thread taskThread = new Thread(new Task(), "task-thread");
taskThread.start();
taskThread.join();
}
}
如果我在主线程中运行任务,它会返回结果,但是当我在新线程中运行它时,它会阻塞在休眠查询中并且永远不会返回。日志只说hibernate已经绑定了查询参数。它没有加载结果集。
我假设这与 spring transaction 和 hibernate session.close() 有关,但无法弄清楚需要更改什么才能使其在不同的线程中执行。
非常感谢,灰