Работа с Hibernate в потоке порождения пользователя в модульном тесте с Spring - PullRequest
0 голосов
/ 06 июля 2019

В проекте используются 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 в нашем потоке, чтобы транзакция была создана и зафиксирована?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...