Melhor pratica com o EntityManagerFactory do JPA

Pessoal,

Gostaria de saber qual seria a melhor pratica de se usar o factory.

Em meu ultimo projeto utilizei um método Static em classe, veja:

public class Factory {

	public static EntityManagerFactory EManager() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("innews");
		return factory;
	}

}

Quando o usuário entrava no sistema, o código criava uma factory e armazenava até que a mesma não fosse mais valida, então, um novo factory seria criado, vejam:

public EntityManager entity() {
	if (eManagerFactory != null) {
		return eManagerFactory.createEntityManager();
	} else {
		eManagerFactory = Factory.EManagerBanco();
		return eManagerFactory.createEntityManager();
	}
}

A classe do usuário logado é do tipo @SessionScoped.

Agora, estou criando um novo projeto e estou pensando em utilizar um ManagedBean anotado com @ApplicationScoped para servir toda a aplicação, e retornar o mesmo entityManager valido a todos os usuários.

O problema é que ainda não testei. É uma boa pratica? é a melhor forma?
Minha preocupação é o fato de o mesmo EntityManager ser passado a qualquer usuário.

O que vocês mais experientes pode me dizer?

Obrigado

Pare de fazer, estude pra valer o jpa e depois volte a fazer o projeto que você estava a fazer.

  1. EntityManager não é thread safe e nem deve ser compartilhado entre usuários
  2. Não existe a necessidade de criar o EntitymanagerFactory a cada chamada, isso é um killer de desempenho e totalmente desnecessário.
  3. EntityManager e EntityManagerFactory sendo acessado por ManagedBean? Outra coisa exótica aí.

Seria uma boa prática deixar o EntityManagerFactory em uma classe application scoped e esse cara servir a aplicação inteira.

Leia esse post e entenda melhor os conceitos do JPA: http://uaihebert.com/?p=1622

[=

Só esclarecendo, acho que posso ter sido interpretado errado. Vejamos:

Sobre a 1… Não compartilho o EntityManager com todos os usuários. Pensei em criar uma classe do tipo @ApplicationScooed pra criar o EntityMa agerFactory e retornar a qualquer usuário da aplicação, isso esta correto? É seguro?

Sobre a 2… Eu crio ele por usuário, e após criado, enquanto estiver valido retorno o mesmo EMF pra o usuário criado.

Sobre a 3… Eu tenho um bean @SessionScoped que guarda as infos do usuário, neste mesmo vejam eu armazeno o EMF criado. Isso e o seguro e errado?

Vou ler o seu post lá, espero esclarecer bastante as idéias.

Vlw

[quote=weder.vierra]Só esclarecendo, acho que posso ter sido interpretado errado. Vejamos:

Sobre a 1… Na aplicação existente eu não compartilho o EntityManager com todos os usuários. Na nova app Pensei em criar uma classe do tipo @ApplicationScoped pra criar o EntityManagerFactory e retornar a qualquer usuário da aplicação, isso esta correto? É seguro?

Sobre a 2… Na aplicação atual eu crio o EMF por usuário, e após criado, enquanto estiver valido retorno o mesmo EMF pra esse usuário, quando não for mais valido eu crio um novo, na sessão desse usuário.

Sobre a 3… Na aplicação eu tenho um bean @SessionScoped que guarda as infos do usuário, neste mesmo Bean eu armazeno o EMF criado. Isso inseguro e errado?

Vou ler o seu post lá, espero esclarecer bastante as idéias.

Vlw[/quote]

Desculpem, tentei responder pelo celular e foi uma confusão só, não consegui deletar o primeiro post.