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