Najlepsze praktyki, aby uzyskać EntityManagerFactory

Jakie jest najlepsze podejście do uzyskania EntityManagerFactory w aplikacji internetowej (jsp/servlets)? Czy jest to dobry sposób Kiedy należy utworzyć/otworzyć instancję EntityManagerFactory?, a może lepiej dostać to od JNDI, czy coś innego?

Author: Jordan Noel, 2011-10-23

1 answers

/ Align = "left" / Musisz je otworzyć przy uruchamianiu aplikacji i zamknąć przy zamykaniu aplikacji.

Jak to zrobić zależy od docelowego kontenera. Czy obsługuje EJB 3.x (Glassfish, JBoss AS, etc)? Jeśli tak, to nie musisz się martwić o ich otwieranie/zamykanie (ani o transakcje) w ogóle, jeśli po prostu wykonujesz zadanie JPA w EJBs z @PersistenceContext zwykły sposób:

@Stateless
public class FooService {

    @PersistenceContext
    private EntityManager em;

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

    // ...
}

Jeśli docelowy Pojemnik Tomcat, Jetty, itp.) i dodatek EJB, taki jak OpenEJB , również nie jest opcją z jakiegoś powodu, a zatem ręcznie majstrujesz przy tworzeniu EntityManagers (i transakcjach) samodzielnie, wtedy najlepszym rozwiązaniem jest ServletContextListener. Oto podstawowy przykład:

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

}

(uwaga: przed Servletem 3.0 klasa ta musi być zarejestrowana przez <listener> w web.xml zamiast @WebListener)

Który może być użyty jako:

EntityManager em = EMF.createEntityManager();
// ...
 57
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-23 01:04:52