Лучшая практика получения 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(); // ... 
  • Hibernate, @SequenceGenerator и allocSize
  • Hibernate: автоматическое создание / обновление таблиц db на основе classов сущностей
  • JPA, Как использовать один и тот же class (сущность) для сопоставления разных таблиц?
  • JPA Query выбирает только определенные столбцы, не используя Query Query?
  • Как сохранить типы JSR-310 с помощью Spring Data JPA?
  • Транзакция, отмеченная только как откат: как мне найти причину
  • Безмолвно игнорируется remove ()
  • Дилемма JPA hashCode () / equals ()
  • JPA - самый быстрый способ игнорировать поле во время сохранения?
  • Как настроить JPA для тестирования в Maven
  • Как просмотреть SQL-запросы, выпущенные JPA?
  • Давайте будем гением компьютера.