1

我将 Google App Engine 与 datanucleus 和 JPA 一起使用。我很难理解我应该如何从数据存储中读取内容并将其传递给 JSP。如果我使用 entitymanager 加载 POJO 列表并将其传递给 JSP,它会崩溃到 org.datanucleus.exceptions.NucleusUserException:对象管理器已关闭。

我明白为什么会这样。显然因为我获取列表,关闭实体管理器并将其传递给 JSP,此时它将失败,因为列表是惰性的。如果不求助于诸如调用 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();
    }
}
4

1 回答 1

1

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

于 2010-05-31T22:44:02.227 回答