2014-07-26 3 views
0

Je cherche comment implémenter Open EntityManager In View dans JPA. Cependant, tout ce que je peux trouver est pour Hibernate (Open Session In View) ou Spring. Pourriez-vous donner un exemple (avec du code si possible) sur la façon de mettre en œuvre le modèle Open EntityManager In View pour JPA et Java EE?Ouvrir EntityManager dans View dans JPA pour Java EE

Répondre

3

Il y a une bonne explication d'une telle implémentation dans le très recommandable Pro JPA 2 Book, chapitre 6, rubrique 'Éviter le détachement'.

Je vais essayer de vous donner quelques indices, mais lisez-le - le livre présente plusieurs approches alternatives et discute de leurs avantages et inconvénients respectifs.

Avec JPA, il existe deux façons d'aborder le problème. Le premier est de travailler avec des entités détachées dans la vue et un contexte de persistance étendue (PC) dans le backend. La seconde consiste à conserver une seule transaction en vie tant que la vue est active. Je suppose que nous parlons de la deuxième stratégie ici - il est appelé «Transaction View» dans le livre.

Un point important est que le deuxième scénario ne fonctionne pas pour les clients distants. Une fois que vous devez sérialiser vos entités, la représentation sérialisée (et désérialisée) n'est en aucun cas attachée à un PC.

L'interrogation et le rendu doivent avoir lieu au cours de la même transaction afin d'utiliser un PC de portée TX. Vous devrez utiliser un UserTransaction au lieu de vous appuyer sur CMT (vous pouvez toujours utiliser CMT dans les beans backend).

L'essentiel:

public class MyServlet extends HttpServlet { 

    @Resource UserTransaction tx; 
    @EJB MyService bean; 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
    // ... 
    try { 
     tx.begin(); 

     List entities = bean.findAll(); 
     request.setAttribute("entities", entities); 
     getServletContext().getRequestDispatcher("/listEntities.jsp") 
     .forward(request, response); 

    } finally { 
     tx.commit(); 
    } 
    // ... 
    } 
} 

Le livre illustre l'utilisation de ce modèle pour une page JPS. Je ne suis pas sûr de savoir comment vous feriez correspondre cette approche à d'autres cadres comme JSF ou Wicket.