2010-05-31 33 views
1

我使用Google App Engine與datanucleus和JPA。我非常難以掌握如何從數據存儲中讀取內容並將其傳遞給JSP。如果我使用entitymanager加載POJO列表並將其傳遞給JSP,它將崩潰到org.datanucleus.exceptions.NucleusUserException:對象管理器已關閉。如何迭代Google App引擎中的JPA集合

我明白爲什麼會發生這種情況。顯然,因爲我讀取列表,關閉實體管理器並將其傳遞給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(); 
    } 
} 
+0

另請參見:http://stackoverflow.com/questions/2294867/google-app-engine-org-datanucleus-exceptions-nucleususerexception-object-manag – 2010-06-01 04:43:48

回答

1

this threadDataNucleus將自身的用於查詢 結果,當事務提交的閱讀的機制。它可能還沒有在插件中實現,但尚未在中實現。這是在Issue 24中報告,直到此問題得到解決,我的理解是,您將不得不呼叫size()加載列表或使用OpenEntityManagerInView模式。

+0

謝謝,雖然我要使用新的LinkedList(結果)或新的ArrayList(結果),因爲它在概念上比我們只需調用size()更合適。至少這樣我可以控制我從查詢中實際得到的集合類型。 我可以使用OpenEntityMangerInView模式,但對於這樣一個簡單的問題,它感覺如此矯枉過正。也許如果軟件的規模增長。 – palto 2010-06-01 16:15:12