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:
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:
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)