0

我正在寻找如何在 JPA 中实现 Open EntityManager In View 模式。但是,我能找到的只是 Hibernate(在视图中打开会话)或 Spring。

你们中的任何人都可以举一个例子(如果可能的话,用代码)如何为 JPA 和 Java EE 实现 Open EntityManager In View 模式?

4

1 回答 1

3

在非常值得推荐的Pro JPA 2 Book第 6 章主题“避免分离”中对这种实现进行了很好的解释。

我将尝试提供一些提示,但请仔细阅读 - 这本书提供了几种替代方法并讨论了它们各自的优缺点。

使用 JPA,有两种方法可以解决这个问题。首先是使用视图中的分离实体和后端中的扩展持久性上下文(PC)。第二个是只要视图处于活动状态,就保持单个事务处于活动状态。我想我们在这里讨论的是第二种策略——在书中称为“事务视图”。

重要的一点是,第二种情况不适用于远程客户端。一旦您必须序列化您的实体,序列化(然后是反序列化)表示不会以任何方式附加到 PC。

为了使用 TX 范围的 PC,查询和呈现必须发生在同一个事务中。您将需要使用 aUserTransaction而不是依赖 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 等其他框架。

于 2014-07-28T10:46:55.667 回答