Spring/Hibernate/TestNG — ручная настройка сеанса и транзакции

Я пытаюсь создать тестовый пример для своих классов DAO, которые используют простой Hibernate API (без таких вещей Spring, как HibernateTemplate, HibernateDaoSupport), вот так:

sessionFactory.getCurrentSession().save(obj);

У меня есть соответствующее определение sessionFactory и transactionManager в контексте весны, как показано в документах весны.

Я хочу открыть транзакцию в моем стартовом коде и откатиться в конце.

Таким образом, это отличается от модульного тестирования Spring по умолчанию, поддерживающего концепцию транзакции для каждого вызова тестового метода, и поэтому я не мог расширить AbstractTransactionalTestNGSpringContextTests.

Мне нужен способ начать транзакцию и каким-то образом передать ее в фабрику сеансов. Я чувствую, что это должно быть очень легко, но не может быть достигнуто после большого количества чтения и экспериментов.

Любая помощь будет принята с благодарностью.


person Max    schedule 28.06.2011    source источник


Ответы (3)


Если вы не хотите использовать HibernateTemplate, вы можете использовать transactionManager напрямую, как описано в 10.6.2 Использование PlatformTransactionManager.

person axtavt    schedule 28.06.2011
comment
Да, это то, что я хочу сделать, но мне нужно как-то связать это с сеансами Hibernate, и это сложная часть для меня. - person Max; 28.06.2011
comment
@m17: Если вы правильно настроили HibernateTransactionManager, он должен быть связан автоматически, см. static.springsource.org/spring/docs/3.0.x/ - person axtavt; 28.06.2011

@Transactional (только чтение = ложь, распространение = распространение. ТРЕБУЕТСЯ)

аннотировать метод тестирования, используя выше

person Niroshan Abayakoon    schedule 28.06.2011
comment
Насколько я понимаю, это будет заключать каждый метод в отдельную транзакцию. И он зафиксирует эту транзакцию, если не будет выброшено исключение? - person Max; 28.06.2011

person    schedule
comment
На самом деле я не мог использовать это, так как мой DAO использует внутренне sessionFactory.getCurrentSession(). Поэтому мне нужен способ сохранить сеанс и связанную с ним транзакцию. В производственной среде я использую весеннюю декларативную транзакцию на сервисном уровне, и для меня все происходит прозрачно. Но в тесте мне нужно вручную обрабатывать эту прозрачность - person Max; 28.06.2011
comment
@ m17 m17 ах, я вижу, я не прочитал ваш вопрос до конца, я думаю. В своих DAO я обычно создаю методы getSession() и setSession(), поэтому я могу использовать DAO i IOC. Итак, в моих тестах junit я создаю сеанс с транзакцией или без нее и устанавливаю его в DAO. - person Karl-Bjørnar Øie; 28.06.2011