我正在尋找如何在JPA中的View模式中實現Open EntityManager。然而,我可以找到的是Hibernate(Open Session In View)或Spring。在JPA for Java EE中的View中打開EntityManager
你們中的任何一個人可以給出一個例子(如果可能的話,代碼)如何在JPA和Java EE的View模式中實現Open EntityManager?
我正在尋找如何在JPA中的View模式中實現Open EntityManager。然而,我可以找到的是Hibernate(Open Session In View)或Spring。在JPA for Java EE中的View中打開EntityManager
你們中的任何一個人可以給出一個例子(如果可能的話,代碼)如何在JPA和Java EE的View模式中實現Open EntityManager?
在非常值得推薦的Pro JPA 2 Book第6章主題'避免分離'中有一個很好的解釋。
我會嘗試給出一些提示,但是請仔細閱讀它 - 本書介紹了幾種備選方法並討論了它們各自的優缺點。
有了JPA,有兩種方法可以解決這個問題。首先是在視圖中使用分離的實體,在後端使用擴展的持久性上下文(PC)。其次是隻要視圖處於活動狀態,就保持單個事務處於活動狀態。我想我們正在談論這裏的第二個策略 - 它在本書中被稱爲「交易視圖」。
重要的一點是第二種方案不適用於遠程客戶端。一旦你不得不序列化你的實體,序列化(然後是反序列化)的表示就不會以任何方式附加到PC上。
查詢和渲染必須發生在同一個事務中才能使用TX範圍的PC。您將需要使用UserTransaction
而不是依靠CMT(您仍然可以在後端Bean中使用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等其他框架。