Estratégia para EntityManager em WebApp com JavaEE 7

4 respostas
L

Pessoal,

Qual seria a melhor estratégia para se obter o EntityManager em uma aplicação web utilizando JavaEE 7?
No caso Estou utilizando JTA Transaction.

Tenho uma classe, por exemplo ClasseServico que tem uma ClasseRepositorio injetado como atributo.
Tanto a ClasseServico quanto a ClasseRepositorio precisam ter uma instância de um EntityManager.

Com a classe “Produtora” abaixo, consigo ter a mesma instância de EntityManager tanto na ClasseServico quanto na ClasseRepositorio, mas sempre pego o mesmo, inclusive em requests diferentes, isso não está me cheirando bem…

Porém gostaria de validar com vocês se essa estratégia é boa. Tenho dúvidas se anotar a classe Produtora com @Singleton
pode ter algum efeito colateral quando mais de um usuário estiver usando o sistema ao mesmo tempo.

As classes Servico e Repositorio tem @RequestScoped

@Singleton
public class ProdutorEntitymanager {

    @PersistenceContext(unitName = "producao")
    @Produces @BancoProducao EntityManager entityManager;

}

4 Respostas

Hebert_Coelho

Utilize um EntityManager por vez (request) apenas e depois mate-o.

Durante o mesmo request pode ser o mesmo EntityManager para todas as chamadas ao banco, mas ao terminar o request chame o método close().

EntityManagerFactory pode ser único para o projeto todo, EntityManager não.

L

Então, tentei obter esse resultado removendo o @Singleton da classe “Produtora”, mas nesse caso cada classe, Servico e Repositorio (no mesmo request) tem um EntityManager diferente.

Hebert_Coelho

leojribeiro:
Então, tentei obter esse resultado removendo o @Singleton da classe “Produtora”, mas nesse caso cada classe, Servico e Repositorio (no mesmo request) tem um EntityManager diferente.
Com a questão do CDI não tenho como te ajudar no momento, o que eu poderia te falar era que utilizar o mesmo EM em todo request é errado.

E

Cara uma solução que venho usando é manter o EntityManagerFactory em escopo de aplicação ( pois este utiliza muitos recursos no servidor quando é criado, como abrir socket por exemplo, etc) e o EntityManager em escopo de request como o Hebert Coelho disse.
Com CDI ficaria desta forma :

@ApplicationScoped
public class ProducerEM {

	@PersistenceUnit
	EntityManagerFactory entityManagerFactory;
	
        @Produces
        @RequestScoped
	public EntityManager getEntityManager() throws Exception {
		return entityManagerFactory.createEntityManager();
	}
	
	public void close(@Disposes EntityManager entityManager ){
		entityManager.close();
		
	}
}

Observer que o método close usa a anotação @Disposes qué chamada no fim do request, esse método é muito importante porque podemos fechar o entityManager.

para injetar …

@Inject
EntityManager

Criado 12 de janeiro de 2014
Ultima resposta 24 de jan. de 2014
Respostas 4
Participantes 3