Injeção de EntityManager e UserTransaction em Managed Bean

7 respostas
sunwebdeveloper

Boa noite galera…
Estou com uma dúvida conceitual…

Estou trabalhando com JSF 1.2(Mojarra+Facelets+Primefaces) e JPA 1.0 (Hibernate), através do JBoss AS 5.1.

Meus ManagedBeans estão implementados como um exemplo abaixo:
Obs. Esse MB está configurado com escopo de sessão.

public class RoboMB {

	@PersistenceContext(unitName="myUnit")
	private EntityManager em;
	
	@Resource
	private UserTransaction ut;
		
	private DictionaryRepository dictionaryRepository;

        @PostConstruct
	public void init(){			
		this.dictionaryRepository = DAOFactory.createDictionaryDAO(this.em);
        }

Pois bem, nunca trabalhei com JSF, e estou entendendo que o container se comportará de forma parecida que ele se comporta com os EJBs…
Se não me engano, no caso dos EJBs stateless, o container controla a qte de instancias de beans no pool(podendo ser configurado), e quando as elimina, mata as entity managers, e no caso dos statefuls, a passivação e ativação tb mata as entity managers, cuidando assim dos objetos caros(conexões com DB), além dos controles transacionais CMT e BMT, estou certo?
E no caso do meu managed beam acima, como funciona? Esse codigo funciona perfeitamente, mas é a forma mais correta de se trabalhar com entity manager e transactions nos Managed Beans?? existe uma boa prática? estou usando tudo de javax.*, funcionaria em outros containers como websphere e weblogic ??

Obrigado,

7 Respostas

A

cara,

minha opinião, eu criaria mais uma camada, Facelete, nela vc teria a sua regra de negocio e la vc faria a injeção do EntityManager e deixaria a MB para so camada de controller.

t+

sunwebdeveloper

Alisson Value cara…
Essa camada seria uma pojo? com as injeções via anotações feitas no MB, e no MB eu soh criaria as referencias a essas classes??
O container consegue injetar esses caras em um simples pojo???
E com relação aos recursos(Entity manager, connection db) ficarem abertos em um MB com escopo sessao?? Isso que eu qria entender…

Valeu cara !!!
Abraços

A

cara, desculpa escrivi errado
é Facade a camada, eu trataria ela com EJB, pq vc deixaria por conta do container gerenciar tudo em relação a entitymanager para vc, com vc so se preucuparia com a regra de negocio msm. E no MB vc teria so uma injecao do Facade com a anotação @Ejb.

t+

sunwebdeveloper

Então cara, mas o problema é que eu não tenho essa opção… o projeto não suporta ejb…
Minha duvida mesmo é saber como esses entity managers irão se comportam em um MB com escopo sessão…

A

entendi,

ele vai comportar da forma normal, vc so vai ter que fazer um controle da transação no dao na mao.

t+

sunwebdeveloper

Mas Vc viu isso que eu fiz:

@Resource  
 private UserTransaction ut;

e na hora de persistir:

private void persiste(Person person) throws NotSupportedException, SystemException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
		this.ut.begin();
		this.em.persist(widget);
		this.ut.commit();
	}

Cara, enquanto esse MB estiver na sessão, a EM fica ativa e com a connection aberta?? Se eu tiver 100 usuários acessando essa tela terei 100 connections presas???

A

como vc ta injento o EntityManager, o container vai controlar para vc, vc pode colocar na configuração do seu persitence.xml, configurações de pool de conexão.

t+

Criado 27 de dezembro de 2011
Ultima resposta 28 de dez. de 2011
Respostas 7
Participantes 2