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

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.

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.

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!

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.

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:

show de bola, valeu Hebert

[quote=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.[/quote]

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)