春に管理された休止状態のトランザクションを使用しています
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="SessionFactory" />
</bean>
@Transactional で注釈が付けられたメソッドを呼び出す Runnable を実装するクラス Task があります。このメソッドは、休止状態の基準クエリ 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 がクエリ パラメータをバインドしたことが示されているだけです。結果セットをロードしていません。
これは春のトランザクションと休止状態の session.close() と関係があると思いますが、これを別のスレッドで実行するために何を変更する必要があるかを理解できません。
どうもありがとう、アッシュ