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

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

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

Как это сделать, зависит от вашего целевого контейнера. Поддерживает ли он 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 этот class должен быть зарегистрирован в web.xml вместо @WebListener )

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

 EntityManager em = EMF.createEntityManager(); // ... 
  • Нарушение спящего режима с помощью orphanRemoval
  • Как вызвать функцию или процедуру Oracle с помощью Hibernate (EntityManager) или JPA 2
  • Поставщик сущностей для EntityManager не указан
  • @Basic (необязательно = false) vs @Column (nullable = false) в JPA
  • Развертывание приложения с использованием Hibernate JPA 2.1 для IBM WebSphere дает NullPointerException
  • API JPA & Criteria - выберите только определенные столбцы
  • ConcurrentModificationException и HashMap
  • Получить фактический тип аргумента generic type для абстрактного суперclassа
  • Как определить однонаправленные отношения OneToMany в JPA
  • Каков правильный путь для ссылки jar-файла в jpa persistence.xml в веб-приложении?
  • В чем разница между удалением каскада и сироты из БД?
  • Давайте будем гением компьютера.