Существует хорошее объяснение такой реализации в самой рекомендуемой главе Pro JPA 2 Book, посвященной разделу «Избегание отстранения».
Я попытаюсь дать некоторые намеки, но прочитайте это - книга представляет несколько альтернативных подходов и обсуждает их соответствующие плюсы и минусы.
С JPA существует два подхода к решению проблемы. Во-первых, это работа с отдельными объектами в представлении и расширенный контекст постоянства (ПК) в бэкэнд. Во-вторых, чтобы сохранить одну транзакцию до тех пор, пока она активна. Полагаю, мы говорим о второй стратегии здесь - это называется «Transaction View» в книге.
Важным моментом является то, что второй сценарий не работает для удаленных клиентов. После того, как вы выполните сериализацию своих объектов, сериализованное (и затем десериализованное) представление никоим образом не привязано к ПК.
Выполнение запросов и рендеринг должно происходить во время одной и той же транзакции, чтобы использовать ПК с областью передачи TX. Вам нужно будет использовать UserTransaction
вместо того, чтобы полагаться на CMT (вы все еще можете использовать CMT в бэкэнд-бобах).
Суть:
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.