Эквивалент OpenEntityManagerInView для заданий Junit и Quartz

Есть ли какой-либо стандартный способ (или замена Open Session [EntityManager] in View) для использования классов, которые зависят от отложенной инициализации (fetch = FetchType.LAZY) сущностей в следующих двух случаях использования:

  1. В тестовых примерах JUnit

  2. В кварцевых работах

Для обоих описанных выше сценариев шаблон OSIV не будет работать, так как в систему не поступает веб-запрос. Как заставить ленивую загрузку работать в таких ситуациях?

PS: Spring OpenEntityManagerInViewFilter и OpenEntityManagerInViewInterceptor оба ориентированы на веб-запросы.

  1. Я не могу предварительно выбрать все такие отношения/сущности, выполнив фиктивную операцию get только для того, чтобы загрузить ее до закрытия сеанса в репозитории (DAO).
  2. Я знаю, для JUnit я могу вручную открывать/закрывать EM в @Before/@after. Но я ищу что-то более элегантное и стандартное.

Ссылка: LazyInitializationException из-за отсутствия сеанса, определенного в контексте родительского приложения. в Hibernate 3 в модульном приложении Spring с использованием аннотаций


person kdabir    schedule 10.08.2011    source источник


Ответы (1)


Транзакции - это то, что вам нужно. Откройте транзакцию, извлеките данные, обработайте их, а затем закройте транзакцию, когда закончите. Spring связывает жизненный цикл EntityManager с жизненным циклом транзакции и держит его открытым столько, сколько вам нужно.

Spring Transaction Management сам по себе является важной темой, но использовать его на самом деле довольно просто. См. документацию.

person skaffman    schedule 10.08.2011
comment
Ну, именно поэтому я разместил вопрос, чтобы избежать ручного открытия/закрытия чего-либо (EM/TX) в каждом задании/тестовом примере (не хочу подталкивать его к базовому классу и делать extends материал). Просто хотел узнать, есть ли способ лучше. - person kdabir; 11.08.2011
comment
@kunal: Spring обеспечивает поддержку транзакционных модульных тестов — см. static.springsource.org/spring/docs/3.0.x/ - person skaffman; 11.08.2011
comment
хорошо, круто, я пытаюсь @Transactional. Это сработало для меня в Job, но пока не повезло в JUnit. Попробую еще и скоро обновлю. Спасибо. - person kdabir; 11.08.2011
comment
да, это сработало для JUnit. Были проблемы с транзитивными зависимостями Spring-JPA -> Spring-Dao. Исключил оба и заработало. Ссылка: norrisshelton.wordpress.com/2011/01 /31/spring-dao-2-x-проблемы - person kdabir; 11.08.2011