Лучшая практика для получения EntityManagerFactory - PullRequest
23 голосов
/ 23 октября 2011

Каков наилучший подход для получения EntityManagerFactory в веб-приложении (jsp / servlets)? Это хороший способ Когда должен быть создан / открыт экземпляр EntityManagerFactory? , или лучше получить его из JNDI, или что-то еще?

1 Ответ

62 голосов
/ 23 октября 2011

Они тяжелые и должны находиться в области применения.Итак, вам нужно открыть их при запуске приложения и закрыть их при завершении работы приложения.

Как это сделать, зависит от целевого контейнера.Поддерживает ли он EJB 3.x (Glassfish, JBoss AS и т. Д.)?Если это так, то вам вообще не нужно беспокоиться об их открытии / закрытии (ни о транзакциях), если вы просто выполняете работу JPA в EJB с @PersistenceContext обычным способом:

@Stateless
public class FooService {

    @PersistenceContext
    private EntityManager em;

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

    // ...
}

Если ваш целевой контейнер не поддерживает EJB (например, Tomcat, Jetty и т. Д.) И надстройка EJB, например OpenEJB , также по какой-то причине не подходит, и вывручную возиться с созданием EntityManager s (и транзакций) самостоятельно, тогда ваша лучшая ставка - ServletContextListener.Вот пример basic kickoff:

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

}

(примечание: до Servlet 3.0 этот класс должен быть зарегистрирован <listener> в web.xml вместо @WebListener)

Который может использоваться как:

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