Откройте 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.