Como gerenciar EntityManagerFactory no JPA2?

5 respostas
U

Fala galera, beleza!?

Em uma aplicação web que to fazendo eu estou usando entidades do banco geradas pelo netbenas, daí aproveitei pra gerar as classes controladoras jpa.
Essas classes pedem um EntityManagegerFactory. Sendo uma aplicação web eu criei a seguinte classe helper:

public class EntityManagerFactoryHelper {
	private static EntityManagerFactory factory;

	public static  EntityManagerFactory getFactory() {

		HttpSession session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(true);

		factory = (EntityManagerFactory)session.getAttribute("factory");

		if(factory == null) {
			factory = Persistence.createEntityManagerFactory("SuperLocadoraPU");
			session.setAttribute("factory", factory);
			return factory;
		} else {
			return factory;
		}
	}
}

Ou seja, jogo a factory na sessão aí toda hora que for usar um dao passo como parâmetro EntityManagerFactoryHelper.getFactory();

Minha dúvida é se isso aí tá correto, se é a melhor maneira de gerenciar esse objeto. Agradeço as respostas!

5 Respostas

Hebert_Coelho

Pra que jogar a EMF na sessão?

Qual a necessidade?

Outra coisa, você sabe o impacto de deixar uma EMF aberto o tempo todo?

U

Ué, não sei porque joguei na sessão, na certa penso que não pode ficar criando toda hora. Mas se puder criar sempre então tranquilo, valeu.

public class EntityManagerFactoryHelper {
	private static EntityManagerFactory factory;

	public static  EntityManagerFactory create() {
		if(factory == null || !factory.isOpen()) {
			factory = Persistence.createEntityManagerFactory("SuperLocadoraPU");
		}
		
		return factory;
	}
	
	public static void close() {
		if(factory != null && factory.isOpen()) {
			factory.close();
		}
	}
}

Ficou assim.

Hebert_Coelho

unkillable:
Ué, não sei porque joguei na sessão, na certa penso que não pode ficar criando toda hora. Mas se puder criar sempre então tranquilo, valeu. Devo tá confundindo alguma coisa. Vou mudar aqui valeu!
Eu não disse para criar toda hora.
Se você já colocou como estático não entendi o por que dele sempre ter ir para a sessão.

Eu perguntei se você sabe o impacto de uma EMF ficar muito tempo aberta. Foi isso.

lele_vader

Eu também pensei que não era para ficar recriando a entityManagerFactory direto.

U

Mudei de tática, lendo a apostila da K19 resolvi implementar o controle de transação por View em vez de por Operação. Então criei um filtro que no request cria o factory, pega o entitymanager e inicia a transação ao final do request fecha tudo.

Criado 28 de setembro de 2012
Ultima resposta 28 de set. de 2012
Respostas 5
Participantes 3