Лучшая практика получения EntityManagerFactory
Каков наилучший подход для получения EntityManagerFactory в веб-приложении (jsp / servlets)? Это хороший способ Когда должен быть создан / открыт экземпляр EntityManagerFactory? , или лучше получить его от JNDI или что-то еще?
- Спящий режим, весна, JPS и изоляция - индивидуальная изоляция не поддерживается
- Указывает ли спецификация JPA ссылки на столбцы не первичного ключа?
- Данные Spring jpa- Определен бит bean с именем 'entityManagerFactory'; Инъекция автоуведомленных зависимостей не удалась
- Spring-Data FETCH JOIN with Paging не работает
- Можно ли динамически определять имена столбцов в Hibernate / JPA?
- Поддержка JPA для Java 8 новых API даты и времени
- JPA нетерпеливый выбор не присоединяется
- Как запустить приложение Spring-Boot без зависимости от базы данных?
Они тяжеловесы, и они должны находиться в области применения. Таким образом, вам нужно открыть их при запуске приложений и закрыть их при завершении работы приложения.
Как это сделать, зависит от вашего целевого контейнера. Поддерживает ли он 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(); // ...