2010-05-31 5 views
1

J'utilise Google App Engine avec datanucleus et JPA. J'ai vraiment du mal à comprendre comment je suis supposé lire des données du magasin de données et les transmettre à JSP. Si je charge une liste de POJO avec entitymanager et la passe à JSP, il se bloque à org.datanucleus.exceptions.NucleusUserException: le gestionnaire d'objets a été fermé.Comment faire une itération des collections JPA dans le moteur Google App

Je comprends pourquoi cela se produit. Évidemment, parce que je récupère la liste, fermez le gestionnaire d'entités et passez-le à JSP, auquel cas il échouera parce que la liste est paresseuse. Comment puis-je faire la liste pas paresseux sans avoir recours à des hacks comme appeler size() ou quelque chose comme ça?

Voici ce que je suis en train de faire:

@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

Voir aussi: http://stackoverflow.com/questions/2294867/google-app-engine-org-datanucleus-exceptions-nucleususerexception-object-manag –

Répondre

1

Selon this thread, DataNucleus lui-même prévoit des mécanismes pour la lecture dans de requête résultats lorsqu'une transaction est validée. Il est probablement pas encore implémenté dans le plugin encore. Cela est signalé dans Issue 24 et jusqu'à ce que ce problème soit résolu, je crois comprendre que vous devrez appeler size() pour charger la liste ou utiliser le modèle OpenEntityManagerInView.

+0

Merci, même si je vais utiliser une nouvelle LinkedList (résultats) ou nouvelle ArrayList (résultats) sur ceci, parce qu'il me semble conceptuellement plus juste qu'appelant la taille(). De cette façon, je peux contrôler le type de collection que je reçois de la requête. Je pourrais employer le modèle d'OpenEntityMangerInView, mais il semble la solution tellement exagérée pour un tel problème simple. Peut-être que si le logiciel se développe en taille. – palto

Questions connexes