Внедрение CDI EntityManager VS @PersistenceContext entitymanager в EJB-контейнер - PullRequest
0 голосов
/ 22 января 2019

Когда мы используем аннотацию @PersistenceContext для EntityManager в среде JAVA EE, контейнер создаст entityManagerFactory (один для всего сеанса, который я предполагаю) и создаст новый EntityManager для каждого запроса (путем его проксирования).

Но, используя CDI без контейнера JAVA EE, я увидел что-то вроде этого:

public class EntityManagerProducer {
private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("livraria");

    @Produces  
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void close(EntityManager em) {
    em.close();
}

}

Использование такого подхода с CDI будет иметь такой же эффект и производительность?Заранее спасибо за любую помощь

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Нет, эффект не тот же. Как сказал Габ в предыдущем ответе, @PersistenceContext по умолчанию вводит отдельный менеджер сущностей для каждой транзакции. Существует также возможность использовать EXTENDED персистентный контекст , но это выходит за рамки вашего вопроса.

С кодом, который вы предоставили с использованием CDI, вы получите экземпляр для каждой точки внедрения, который будет отличаться, если вы не создадите компонент , вводящий для каждой транзакции (скорее всего, нет).

Однако вы можете использовать продюсера RequestScoped для вашего менеджера сущностей, например:

 public class EntityManagerProducer {
     private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("livraria");

     @Produces
     @RequestScoped
     public EntityManager getEntityManager() {
         return emf.createEntityManager();
     }
 }

Это даст вам аналогичную семантику в веб-приложении, но могут возникнуть некоторые подводные камни, если вы планируете смешивать код EJB и не-EJB, поскольку этот менеджер сущностей не знает о выполняемых транзакциях. Часть этого покрыта здесь .

Вам также следует проверить этот похожий вопрос Получение ссылки на EntityManager в приложениях Java EE с использованием CDI , где вы можете найти множество отличных обсуждений по этому вопросу.

0 голосов
/ 27 марта 2019

«Использование этого подхода с CDI будет иметь тот же эффект»

Нет, не будет, при использовании @PersistenceContext контейнер Java EE предоставит вам отдельный экземпляр entityManager для каждой транзакции.

Здесь вы будете получать уникальный экземпляр в каждой точке внедрения, что может быть проблематично (например, они не являются поточно-ориентированными, более того, состояние персистентного контекста не будет совпадать с состоянием базы данных, если ваши данные обновляются где-то еще, так как связанный объект имеетбыл загружен).

...