我使用带有datanucleus和JPA的Google App Engine。我真的很难理解我应该如何从数据存储中读取内容并将其传递给JSP。如果我使用entitymanager加载POJO列表并将其传递给JSP,它会崩溃到org.datanucleus.exceptions.NucleusUserException:对象管理器已经关闭。
我明白为什么会这样。显然,因为我获取列表,关闭实体管理器并将其传递给JSP,此时它将失败,因为列表是惰性的。我如何使列表 NOT 懒惰而不诉诸于调用size()或类似的东西?
这是我正在尝试做的事情:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("parties", getParties());
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/parties.jsp");
dispatcher.forward(req, resp);
}
private List<Party> getParties(){
EntityManager em = entityManagerProvider.get();
try{
Query query = em.createQuery("SELECT p FROM Party p");
return query.getResultList();
}finally{
em.close();
}
}
答案 0 :(得分:1)
根据this thread, DataNucleus本身提供了读入查询的机制
事务提交时的结果。它可能尚未在插件中实现。这是在Issue 24中报告的,在此问题得到解决之前,我的理解是您必须调用size()
来加载列表或使用OpenEntityManagerInView
模式。