В проекте используются Spring и Hibernate.
Я пытаюсь одновременно тестировать сервисы, которые также выполняют некоторые запросы Hibernate. Что я делаю, так это создаю множество задач, вызывающих эти службы и помещающих их в исполняющий модуль с фиксированным потоком, который будет запускать их параллельно.
Уровень персистентности работает с SessionFactory Hibernate (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 в нашем потоке, чтобы транзакция была создана и зафиксирована?