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