Откройте EntityManager в представлении в JPA для Java EE

Я ищу, как реализовать шаблон Open EntityManager In View в JPA. Однако все, что я могу найти, это для Hibernate (Open Session In View) или Spring.

Может ли кто-нибудь из вас привести пример (с кодом, если это возможно) о том, как реализовать шаблон Open EntityManager In View для JPA и Java EE?

1 ответ

Решение

Хорошее объяснение такой реализации есть в очень рекомендуемой книге Pro JPA 2, глава 6, тема "Избегание отрешенности".

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

С JPA есть два пути решения проблемы. Во-первых, это работа с отсоединенными объектами в представлении и расширенным контекстом персистентности (ПК) в бэкэнде. Второе - поддерживать одну транзакцию, пока представление активно. Я полагаю, что речь идет о второй стратегии - она ​​называется "Просмотр транзакций" в книге.

Важным моментом является то, что второй сценарий не работает для удаленных клиентов. Когда вам нужно сериализовать ваши объекты, сериализованное (а затем десериализованное) представление никоим образом не подключается к ПК.

Запросы и рендеринг должны выполняться во время одной и той же транзакции, чтобы использовать ПК в области TX. Вам нужно будет использовать UserTransaction вместо того, чтобы полагаться на CMT (вы все еще можете использовать CMT в бинах bean-компонентов).

Суть:

public class MyServlet extends HttpServlet {

  @Resource UserTransaction tx;
  @EJB MyService bean;

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
    // ...
    try {
      tx.begin();

      List entities = bean.findAll();
      request.setAttribute("entities", entities);
      getServletContext().getRequestDispatcher("/listEntities.jsp")
      .forward(request, response);

    } finally {
      tx.commit();
    }
  // ...
  }
}

Книга иллюстрирует использование этого шаблона для страницы JPS. Я не уверен, как бы вы отобразили этот подход на другие фреймворки, такие как JSF или Wicket.

Другие вопросы по тегам