EJB/@TransactionManagement

11 respostas
F

Boa tarde amigos.

Estou utilizando a tecnologia EJB.
Tenho DAOs stateless e Façades(para regras de negocio) tbm stateless.
Tinha dúvida é em qual dos dois bens é recomendavel utilizar o @TransactionManagement.

Obrigado

11 Respostas

H

Primeira pergunta é, você entendeu para que serve o @TransactionManagement?

F

Olá,

Primeiro obrigado pela resposta.

Entendi sim.
Esta anotação funciona somente com com EJBs.
Ela serve para eu escolher entre ContainerManaged Transactions - CMT (transação automaticamente gerenciada pelo container) e BeanManaged Transactions - BMT (controle de transação manual, begin/commit)

Tem os @TransactionAttribute também mas este não é o foco desta pergunta.
Isto está intendido.

Como tenho DAOs e facades implementados com o @stateless(EJB), minha dúvida é: Aonde é mais recomendado eu anotar o @TransactionManagement e os @TransactionAttribute?
No DAO ou nos Facades?

Obrigado

H

fabiocesar.ti:
Olá,

Primeiro obrigado pela resposta.

Entendi sim.
Esta anotação funciona somente com com EJBs.
Ela serve para eu escolher entre ContainerManaged Transactions - CMT (transação automaticamente gerenciada pelo container) e BeanManaged Transactions - BMT (controle de transação manual, begin/commit)

Tem os @TransactionAttribute também mas este não é o foco desta pergunta.
Isto está intendido.

Como tenho DAOs e facades implementados com o @stateless(EJB), minha dúvida é: Aonde é mais recomendado eu anotar o @TransactionManagement e os @TransactionAttribute?
No DAO ou nos Facades?

Obrigado

Beleza, agora vem a outra pergunta… Por que você quer usar essas anotações?

F

Olá,

Bom, um dos motivos é que nós trabalhamos em equipe.
Sei que se eu não colocar nenhuma anotação, ela assume como @TransactionManagement(TransactionManagementType.CONTAINER) e @TransactionAttribute(TransactionAttributeType.REQUIRED).

Mas queria deixar explicito isto no código para que, quando um outro membro da equipe, veja que está sendo usado este tipo de transação e não tente por exemplo, fazer begin/commit.

Outro motivo também é que vou ter métodos que não precisa se ter transação (consulta com select, e outras funções da regra de negocio).

Então queria utilizar explicitamente estas anotações.

Consegui me fazer entender?

H

Então… partindo do que você falou, pela lógica você teria que anotar todo mundo.

Partindo da sua afirmação, vai que você anota o Facade e um infeliz começa a fazer begin/commit no DAO?

Mas na boa? Eu não me preocuparia com isso. Se alguém for fazer caca, vai fazer do mesmo modo. [=

F

Sim, concordo contigo.

Mas para fins acadêmicos e de curiozidade, hehe, qual seria o melhor lugar para implementar estas anotações?
Tu implementaria no DAO ou no Façade?

Outra pergunta, é correto eu ter dois EJBs(DAO e Façade)?

R

Mesmo em métodos que só fazem consulta acho que é bom ter transações explícitas. A maioria dos RDBMS vai automaticamente fazer cada select em uma transação separada de qualquer jeito. Você vai acabar com n transações ao invés de uma única, uma pra cada consulta. A performance vai é ser bem pior.

Antes de fazer isso veja se realmente vai ter vantagem, a depender do banco que você usando.

OBS: Esse cenário é supondo que ele está pensando em usar NOT_SUPPORTED nesses “métodos de consulta que não precisa ter transação”.

H

rodrigo.uchoa:
Você vai acabar com n transações ao invés de uma única, uma pra cada consulta. A performance vai é ser bem pior.
Opa, calma ae.
Isso não acontece mesmo. Se você não declarar o tipo de transação, o padrão e REQUIRED. REQUIRED caso não exista transação ele cria, se existir e ele não criará e utilizará a transação corrente.

Cuidado ao afirmar esses tipos de coisas…

H

fabiocesar.ti:
Mas para fins acadêmicos e de curiozidade, hehe, qual seria o melhor lugar para implementar estas anotações?
Tu implementaria no DAO ou no Façade?

Outra pergunta, é correto eu ter dois EJBs(DAO e Façade)?

Tanto faz. Se você colocar no DAO e o Facade que não estiver anotado chamar esse DAO, tratando que todos são EJBs, o Facade iniciará a transação que será repassada ao DAO.

Isso não influencia em nada.

É correto ter os dois, caso você queira os dois como EJB. Pessoalmente, com EJB 3.1, os definiria como Singleton.

F

Também não concordo com esta afirmação.
É bem isso que o Hebert disse.

Obrigado pela resposta.
Esclareceu minhas dúvidas.

R

Opa, calma ae.
Isso não acontece mesmo. Se você não declarar o tipo de transação, o padrão e REQUIRED. REQUIRED caso não exista transação ele cria, se existir e ele não criará e utilizará a transação corrente.

Eu não quis dizer a ausência de anotação. Que como você bem disse, é REQUIRED por padrão. Eu quis dizer a ausência de transação. Entendi que ele usaria “NOT_SUPPORTED” ou algo do tipo, uma vez que ele insinuou que “métodos não vao precisar de transação”. Eu quis dizer exatamente o contrário, todos precisam.

Criado 23 de dezembro de 2013
Ultima resposta 24 de dez. de 2013
Respostas 11
Participantes 3