JSF2: Открытая сессия с EJB? - PullRequest
6 голосов
/ 30 июня 2010

Имеет ли смысл говорить об Open Session In View Pattern в приложениях JSF2? В моем приложении есть JSF2 Managed Beans, вызывающие EJB-компоненты Business Service, которые выполняют всю работу, связанную с БД (есть слой DAO, но это сейчас не имеет значения).

Наличие шаблона OSIV означало бы, что Управляемый компонент должен каким-то образом удостовериться, что основной сеанс открыт.

Я также использую JPA.

1 Ответ

2 голосов
/ 30 июня 2010

Теоретически, проблема точно такая же: сущность станет отделяться, когда они покидают EJB, если что-то не оставляет область действия EntityManager открытой. (Вот отличный пост по теме в целом: Шаблоны реализации JPA: отложенная загрузка ).

Из сообщения в блоге Я прочитал:

8) Нет открытой поддержки Entity Manager In View. [...] В EJB3, когда ваша сущность покидает боб с областью транзакции EntityManager, это оторвано от настойчивости контекст, и вы больше не можете полагаться на ленивая загрузка (на самом деле JPA спецификация не определяет поведение в такой ситуации, наверное некоторые зависимые от поставщика исключения будут быть брошенным ...) Конечно, вы можете использовать EntityManager с расширенным постоянный контекст , содержащий контекст транзакции и постоянства как пока ты хочешь. Но эта особенность доступно только для SFSB, а DAO классы являются типичными примерами услуги без гражданства, так как они только отправлять призывы к постоянству слой. Кроме того, посвятив Экземпляр компонента DAO для каждого клиента кажется большим перебором.

Однако я не уверен, что это действительно так. Насколько я понимаю, вы сможете написать фильтр сервлетов, который использует UserTransaction для запуска и фиксации транзакции (как обычный фильтр в OSIV). Затем EJB будет участвовать в транзакции, запущенной в фильтре, и EntityManager останется открытым. Я не проверял это хотя, но мое предложение состояло бы в том, чтобы попробовать это.

...