Лучшая практика получения EntityManagerFactory
Каков наилучший подход для получения EntityManagerFactory в веб-приложении (jsp / servlets)? Это хороший способ Когда должен быть создан / открыт экземпляр EntityManagerFactory? , или лучше получить его от JNDI или что-то еще?
- Spring Boot, Spring Data JPA с несколькими источниками данных
- inverse = true в аннотациях JPA
- Как загрузить ленивые элементы из Hibernate / JPA в моем controllerе
- JPA 2.0 аннотация @OrderColumn в Hibernate 3.5
- JPA Несколько встроенных полей
- JPA Query выбирает только определенные столбцы, не используя Query Query?
- JPA getSingleResult () или null
- Как хранить дату Java в Mysql datetime ...?
Они тяжеловесы, и они должны находиться в области применения. Таким образом, вам нужно открыть их при запуске приложений и закрыть их при завершении работы приложения.
Как это сделать, зависит от вашего целевого контейнера. Поддерживает ли он 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(); // ...