Quelle est la meilleure approche pour obtenir EntityManagerFactory dans une application Web (jsp/servlets)? Est-ce un bon moyen Quand l'instance EntityManagerFactory doit-elle être créée/ouverte? , ou est-il préférable de l'obtenir auprès de JNDI, ou autre chose?
Ils sont lourds et 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.
La procédure à suivre dépend de votre conteneur cible. Prend-il en charge EJB 3.x (Glassfish, JBoss AS, etc.)? Si c'est le cas, vous n'avez pas à vous soucier de les ouvrir/fermer (ni des transactions) du tout si vous effectuez simplement le travail JPA dans les EJB avec @PersistenceContext
de 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 ne prend pas en charge les EJB (par exemple Tomcat, Jetty, etc.) et qu'un module complémentaire EJB comme OpenEJB n'est pas non plus une option pour une raison quelconque, et vous êtes donc en train de manipuler manuellement la création EntityManager
s (et transactions) vous-même, alors votre meilleur pari est un ServletContextListener
. Voici un exemple de lancement de base :
@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ée par <listener>
dans web.xml
au lieu de @WebListener
)
Qui peut être utilisé comme:
EntityManager em = EMF.createEntityManager();
// ...