2014-07-26 33 views
0

我正在尋找如何在JPA中的View模式中實現Open EntityManager。然而,我可以找到的是Hibernate(Open Session In View)或Spring。在JPA for Java EE中的View中打開EntityManager

你們中的任何一個人可以給出一個例子(如果可能的話,代碼)如何在JPA和Java EE的View模式中實現Open EntityManager?

回答

3

在非常值得推薦的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等其他框架。

相關問題