Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Injetando EntityManager via CDI Versus @PersistenceContext do EJB

Usando EJB, ao injetar um entitymanager via @persistenceContext o container fica responsavel por criar o EntityManagerFactory e a cada requisicao e criado apenas um entityManager ( se por acaso uma camada chamar outra camada que tambem tenha um entityManager injetado, eles serao na verdade um proxy para o mesmo entitymanager)

Como isso fica se tratando do CDI? tem alguma perda de performance ao se instanciar o entitymanagerFactory usando new diretamente? o entitymanagertambem é gerado como proxy?

VIDE:


    private static EntityManagerFactory emf = Persistence
            .createEntityManagerFactory("livraria");

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

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

obrigado

2 respostas
solução

A diferença só vem em como o objeto a ser chamado é resolvido pelo container. Por "resolvido", simplesmente queremos dizer onde e como o contêiner procura a instância real a ser invocada.

No CDI, o container procura em um "escopo", que será basicamente um hashmap que vive por um período de tempo específico (por request = @RequestScoped, por sessão = @SessionScoped, por aplicativo = @ApplicationScoped).

No EJB, o contêiner também procura em um hashmap se o bean for do tipo @Stateful. Um bean @Stateful também pode usar qualquer uma das anotações de escopo acima, fazendo com que ele viva e morra com todos os outros beans no escopo. No EJB @Stateful é essencialmente o bean "qualquer escopo". O @Stateless é basicamente um pool de instâncias - você obtém uma instância do pool durante uma chamada. O @Singleton é essencialmente @ApplicationScoped

Então, em um nível fundamental, qualquer coisa que você possa fazer com um bean "EJB" você deve ser capaz de fazer com um bean "CDI". Debaixo dos panos é muito difícil diferenciá-las. Todo o encanamento é o mesmo com a exceção de como as instâncias são resolvidas.

Eles não são atualmente os mesmos em termos dos serviços que o contêiner oferecerá ao fazer esse proxy, mas estamos trabalhando nele no nível de especificação do Java EE.

Agregou bastante, obrigado.