如何在Google App引擎中迭代JPA集合

时间:2010-05-31 19:11:14

标签: google-app-engine jpa datanucleus

我使用带有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();
    }
}

1 个答案:

答案 0 :(得分:1)

根据this thread DataNucleus本身提供了读入查询的机制 事务提交时的结果。它可能尚未在插件中实现。这是在Issue 24中报告的,在此问题得到解决之前,我的理解是您必须调用size()来加载列表或使用OpenEntityManagerInView模式。