1

私はGoogleAppEngineを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自体が、トランザクションがコミットされたときにクエリ結果を読み込むためのメカニズムを提供します。プラグインにはまだ実装されていない可能性があります。これはIssue24で報告されておりsize()、この問題が解決するまでは、リストをロードするか、OpenEntityManagerInViewパターンを使用するために呼び出す必要があると理解しています。

于 2010-05-31T22:44:02.227 に答える