2011-10-22 22 views

Respuesta

57

Son de peso pesado y se supone que deben estar en el ámbito de aplicación. Por lo tanto, debe abrirlos al inicio de la aplicación y cerrarlos al apagar la aplicación.

Cómo hacerlo depende de su contenedor de destino. ¿Es compatible con EJB 3.x (Glassfish, JBoss AS, etc.)? Si es así, entonces usted no necesita preocuparse de apertura/cierre de ellos (ni acerca de las transacciones) en absoluto si usted acaba de hacer el trabajo de la APP en los EJB con @PersistenceContext la forma habitual:

@Stateless 
public class FooService { 

    @PersistenceContext 
    private EntityManager em; 

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

    // ... 
} 

Si el contenedor de destino doesn es compatible con EJB (por ejemplo, Tomcat, Jetty, etc.) y un complemento EJB como OpenEJB tampoco es una opción por algún motivo, y usted está manipulando manualmente la creación de EntityManager s (y transacciones), entonces su mejor apuesta es un ServletContextListener. He aquí una básica ejemplo patada de salida:

@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(); 
    } 

} 

(nota: antes de Servlet 3.0, esta clase tiene que ser registrado por <listener> en web.xml en lugar de @WebListener)

que puede ser utilizado como:

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

Excelente ejemplo como siempre, pero solo quería agregar que cuando se utiliza el @PersistenceContext sin ningún atributo "unitName", implica (i n una forma no declarativa) uso de la unidad de persistencia única/predeterminada definida en "persistence.xml". Si hay múltiples fuentes de datos/unidades de persistencia, podría generar cierta confusión sobre cuál es esta. –

+0

No estoy seguro de qué más falta, ¿sigo tu respuesta pero hay un error de tiempo de ejecución? > Causado por: org.springframework.beans.factory.NoSuchBeanDefinitionException: no se ha definido ningún bean único de tipo [javax.persistence.EntityManagerFactory]: single bean esperado pero se encontró 0: – huahsin68

+3

@ huahsin68: la pregunta original no involucra a Spring en absoluto y yo tampoco hago primavera. Simplemente presiona "Preguntar". – BalusC

Cuestiones relacionadas