Подтвердить что ты не робот

Лучшая практика получения EntityManagerFactory

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

4b9b3361

Ответ 1

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

Как это сделать, зависит от вашего целевого контейнера. Поддерживает ли он 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 (и транзакции) самостоятельно, тогда ваш лучший выбор - ServletContextListener. Вот пример основного запуска:

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