EJB/@TransactionManagement

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

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

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

[quote=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[/quote]Beleza, agora vem a outra pergunta… Por que você quer usar essas anotações?

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?

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. [=

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

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”.

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

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

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

Obrigado pela resposta.
Esclareceu minhas dúvidas.

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

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.