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)