Gerenciamento de Transações EJB pelo ManagedBean (JSF)

6 respostas
felipe_gdr

Olá!

Existe alguma maneira de gerenciar transações do banco a partir de um método no ManagedBean?

Meu sistema tem módulos diferentes para JSF (war) e EJB (jar), sendo que todas as ações de banco de dados estão dentro do módulo EJB. Injeto os beans através de @EJB.

Gostaria de fazer algo parecido com o exemplo abaixo:

@EJB 
private MeuSessionBean1 meuBean1;

@EJB 
private MeuSessionBean2 meuBean2;

public void executaAcao() {
     // inicia transação
     meuBean1.executaAcaoNoBanco();

     meuBean2.executaOutraAcaoNoBanco();
     // flush na transação ou rollback, caso haja erro em um dos dois métodos acima

}

Isso é possível, ou tenho que gerencias as transações de dentro dos EJBs?

Abs.

6 Respostas

lele_vader

Se você quiser transação controlada pelo container, usando o @Transactional acho que só mesmo em um ejb.

Agora você pode usar o UserTransaction e controlar a sua transação você mesmo, daí acredito que daria para fazer o que você quer.

Mas não acho uma boa controlar transação no managed bean, pois é inserir lógica de negócio na camada de apresentação.

felipe_gdr

Concordo lele, repensei esse conceito e estou tratando as transações dentro do EJB. Aliás não precisei fazer muita coisa, pois o contâiner lida com transações de maneira automática, basta que as chamadas estejam dentro do mesmo método, correto?

Abs!

lele_vader

Daí não sei, mas acredito que se você colocar em um ejb o @Transactional e como dependência os outros 2 ejb talvez funcione.

Vale o teste.

Hebert_Coelho

Você pode na verdade fazer o seguinte. Criar um EJB que dentro dele ficaria suas outras duas pendências do EJB e ele chamaria os outros dois.

Não é boa prática deixar controle de transação dentro do MB. Mas caso ainda seja o seu desejo, você pode injetar um EntityManagerFactory no MB e cuidar da transação na unha. :twisted: :twisted: :twisted:

felipe_gdr

show de bola, valeu Hebert

sergiotaborda

felipe_gdr:
Olá!

Existe alguma maneira de gerenciar transações do banco a partir de um método no ManagedBean?

Meu sistema tem módulos diferentes para JSF (war) e EJB (jar), sendo que todas as ações de banco de dados estão dentro do módulo EJB. Injeto os beans através de @EJB.

Gostaria de fazer algo parecido com o exemplo abaixo:

@EJB 
private MeuSessionBean1 meuBean1;

@EJB 
private MeuSessionBean2 meuBean2;

public void executaAcao() {
     // inicia transação
     meuBean1.executaAcaoNoBanco();

     meuBean2.executaOutraAcaoNoBanco();
     // flush na transação ou rollback, caso haja erro em um dos dois métodos acima

}

Isso é possível, ou tenho que gerencias as transações de dentro dos EJBs?

Abs.

Isto não faz sentido.

O que vc quer é compor a chamada a serviços EJB que o bean chama e não o bean em si

Se o bean 1 chaam o serviço A e o bean 2 chama o serviço B o que vc quer é chamar A e B na mesma transação.
Então a solução é , crie o serviço C que chama A e B na sua transação. Faça o managed bean chamar C.
Desta forma o serviço C é que controla a transação e toda a transação fica no EJB onde deveria. Transação na UI é simplesmente gambiarra e tá errado por definição.

O C é a implementação do padrão Service Façade tambpém chamado de Serviço de Orquestração (em SOA)

Criado 6 de fevereiro de 2013
Ultima resposta 6 de fev. de 2013
Respostas 6
Participantes 4