2011-10-22 5 views

Répondre

57

Ils sont lourds et ils sont censés être dans le champ d'application. Vous devez donc les ouvrir au démarrage de l'application et les fermer à l'arrêt de l'application.

Comment faire cela dépend de votre conteneur cible. Supporte-t-il EJB 3.x (Glassfish, JBoss AS, etc.)? Si oui, alors vous n'avez pas à vous soucier de l'ouverture/les fermer (ni sur les transactions) du tout si vous venez de faire le travail JPA dans EJBs avec @PersistenceContext la manière habituelle:

@Stateless 
public class FooService { 

    @PersistenceContext 
    private EntityManager em; 

    public Foo find(Long id) { 
     return em.find(Foo.class, id); 
    } 

    // ... 
} 

Si votre conteneur cible doesn ne supporte pas les EJB (par exemple Tomcat, Jetty, etc) et un add-on EJB comme OpenEJB n'est pas non plus une option pour une raison quelconque, et vous êtes donc manuellement en train de créer EntityManager s (et transactions) vous-même, puis votre meilleur pari est un ServletContextListener. Voici un de base coup d'envoi exemple:

@WebListener 
public class EMF implements ServletContextListener { 

    private static EntityManagerFactory emf; 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     emf = Persistence.createEntityManagerFactory("unitname"); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     emf.close(); 
    } 

    public static EntityManager createEntityManager() { 
     if (emf == null) { 
      throw new IllegalStateException("Context is not initialized yet."); 
     } 

     return emf.createEntityManager(); 
    } 

} 

(Note: avant Servlet 3.0, cette classe doit être enregistré par <listener> en web.xml au lieu de @WebListener)

qui peut être utilisé comme:

EntityManager em = EMF.createEntityManager(); 
// ... 
+0

Excellent exemple comme toujours mais je voulais juste ajouter que lorsque vous utilisez le @PersistenceContext sans attribut "unitName", cela implique (i n un moyen non déclaratif) l'utilisation de l'unique/persistence-unit définie dans "persistence.xml". S'il y a plusieurs sources de données/unités de persistance, cela pourrait créer une certaine confusion quant à savoir lequel. –

+0

Vous ne savez pas quoi d'autre manque, je suis votre réponse mais il y a une erreur d'exécution? > Causée par: org.springframework.beans.factory.NoSuchBeanDefinitionException: Aucun bean unique de type [javax.persistence.EntityManagerFactory] n'est défini: haricot unique attendu mais trouvé 0: – huahsin68

+3

@ huahsin68: La question originale n'implique pas le printemps du tout et je ne fais pas le printemps non plus. Appuyez simplement sur "Poser une question". – BalusC