Quelle est la meilleure approche pour obtenir EntityManagerFactory dans l'application web (jsp/servlets). est-ce une bonne façon When should EntityManagerFactory instance be created/opened?, ou il vaut mieux l'obtenir de JNDI, ou autre chose ...Meilleure pratique pour obtenir EntityManagerFactory
Répondre
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();
// ...
- 1. Meilleure pratique pour applicationDidEnterBackground
- 2. python obtenir des variables d'instance meilleure pratique
- 3. meilleure pratique pour l'interrogation d'annuaire
- 4. Meilleure pratique pour Java IPC
- 5. Meilleure pratique pour NSUserDefaults synchroniser
- 6. Meilleure pratique pour cftry/cfcatch
- 7. Meilleure pratique pour l'envoi ItemsSource
- 8. Meilleure pratique pour ruby require
- 9. Entity Framework - meilleure pratique pour obtenir le nombre
- 10. jQuery Datastore meilleure pratique?
- 11. Lorsque entityManagerFactory n'est pas nommé "entityManagerFactory"
- 12. Meilleure pratique pour un grand service WCF?
- 13. Meilleure pratique pour les boutons de soumission
- 14. Meilleure pratique pour répondre à l'événement keyDown
- 15. Meilleure pratique pour l'idiome de référence scopé?
- 16. meilleure pratique dans mysql?
- 17. Entité Framework meilleure pratique
- 18. HttpWebRequest.BeginGetRequestStream() meilleure pratique
- 19. .net Meilleure pratique API
- 20. Meilleure pratique d'architecture Hibernate
- 21. Meilleure pratique: Navigation Drawer
- 22. JDBC Meilleure pratique
- 23. Single SignOn - Meilleure pratique
- 24. Meilleure pratique: ForEach imbriqué
- 25. SQL Select Meilleure pratique
- 26. HABTM meilleure pratique
- 27. Dojo Layers meilleure pratique
- 28. Meilleure pratique avec Math.Pow
- 29. Git (DVCS) Meilleure pratique
- 30. MVC5 DataContext Meilleure pratique?
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. –
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
@ 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