我正在寻找如何在 JPA 中实现 Open EntityManager In View 模式。但是,我能找到的只是 Hibernate(在视图中打开会话)或 Spring。
你们中的任何人都可以举一个例子(如果可能的话,用代码)如何为 JPA 和 Java EE 实现 Open EntityManager In View 模式?
我正在寻找如何在 JPA 中实现 Open EntityManager In View 模式。但是,我能找到的只是 Hibernate(在视图中打开会话)或 Spring。
你们中的任何人都可以举一个例子(如果可能的话,用代码)如何为 JPA 和 Java EE 实现 Open EntityManager In View 模式?
在非常值得推荐的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 等其他框架。