2013-01-16 4 views
0

Je déplace une application JPA-Hibernate d'un environnement Java EE 6 vers un environnement Tomcat 7.Hibernate - Gestion EntityManager

L'application a plusieurs classes DAO effectuant des requêtes sur le EntityManager. Dans l'environnement Java EE, je pouvais simplement l'injecter en utilisant l'annotation @PersistenceContext, et laisser le conteneur gérer le EntityManager. Maintenant que je dois le faire manuellement, je me demandais quel est le chemin à parcourir.

Le gestionnaire d'entité doit-il être unique? Si oui, peut-il s'agir d'un champ static final, créé au démarrage et utilisé par chaque classe DAO? A-t-il un cycle de vie qui implique de le fermer puis de le rouvrir?

+0

Que voulez-vous dire en passant de Java EE 6 à Tomcat 7? Peux-tu être plus précis? – Zutty

+0

L'application s'exécutait sur glassfish, qui est un conteneur JEE, fournissant ainsi l'injection @PersistenceContext. Maintenant, l'application s'exécutera sur Tomcat, qui ne fournit pas ce mécanisme. – kgautron

+0

Si pour une raison ou une autre vous voulez vous éloigner de GlassFish, pourquoi passer à TomEE? C'est Tomcat aussi, mais * avec * le support de '@ PersistenceContext'. –

Répondre

2

Malheureusement, vous devrez le faire manuellement. Le je fais d'habitude comme il est de définir une classe spéciale:

public class EMF { 
    private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("name"); 

    public static EntityManager getEntityManager() { 
    return factory.createEntityManager(); 
    } 
} 

Donc, chaque fois que vous avez besoin EntityManager, vous devez créer manuellement. Vous devez également gérer les transactions:

EntityManager em = EMF.getEntityManager(); 
EntityTransaction et = em.getTransaction(); 
try { 
    MyEntity my = new MyEntity(); 
    et.begin(); 
    try { 
    em.persist(my); 
    et.commit(); 
    } catch (Exception ex) { 
    if (et.isActive()) 
     et.rollback(); 
    } 
} finally { 
    em.close(); 
} 
+0

J'ai donc besoin de créer un nouveau EntityManager chaque fois que j'accède à la base de données. Est-ce exact? – kgautron

+2

Oui. De plus, vous devez gérer manuellement les transactions. – gcvt

Questions connexes