EJB3 + JPA - Propagando Transação  XML
Índice dos Fóruns » Java Enterprise Edition (Java EE)
Autor Mensagem
Maracuja
GUJ Ranger
[Avatar]

Membro desde: 28/03/2006 10:18:44
Mensagens: 940
Localização: Behind the screen
Offline

Olá meus jovens amigos, já é tarde e estou com um problema, gostaria de vossas opiniões! ahIUAHuiahIUAHuiahIUAh

Bom, vamos lá estou brincando aqui; construindo um brinquedo com as seguintes camadas Action -> BusinessDelegate -> SessionFacade(EJB3) -> ApplicationService -> BusinessObject -> DAO (JPA)

Porém não estou conseguindo persistir dados com um bean CMT e esta arquitetura.... consigo apenas se estiver persistindo no proprio CMT!!!!

Bean


o AS



ai vem o BO somente efetuando as chamadas e no DAO esta assim




so que no flush recebo um

javax.persistence.TransactionRequiredException: no transaction is in progress


Viram???

Somente estou conseguindo persistir por enquanto da seguinte forma

Outro método do mesmo Bean



poderia fazer o metodo com a anotação @TransactionManagement(TransactionManagementType.CONTAINER)

mas não importa...

Agora vejam o AS como ficou



onde AbstractApplicationService é



e a PersistenceUtil é



no meu dao agora tenho a mesma coisa de antes



pra completar a minha entity




Deu pra entender?

Parece que a transação não é propagada no bean CMT, somente funciona com o BMT, porém assim preciso garantir a Atomicidade da transação na "mão".

Aindo to estudando e brincando com isso, amanhã continua, mas se alguem puder me ajudar... hehehehehehe

Fico grato pela ajuda.


"Nunca deixarei de reclamar, mas espero reclamar de coisas melhores a cada dia..." Um amigo muito sabio
Henrik
JavaChild

Membro desde: 26/03/2006 22:06:12
Mensagens: 100
Offline

nao posso ajudar, mas voce pode me ajudar

eu ia tirar esse fim de semana pra dar uma olhada exatamente nesses conceitos, se voce pudesser compartilhar este seu projetinho
micheldemontalvao
Debugger

Membro desde: 20/04/2006 10:32:12
Mensagens: 59
Offline

Maracuja wrote:

Parece que a transação não é propagada no bean CMT, somente funciona com o BMT, porém assim preciso garantir a Atomicidade da transação na "mão".


Olhando seu código da para perceber que você está controlando a gerência do EntityManager manualmente:



Eu ainda não dei uma olhada profunda na especificação do EJB3, mas acho que não mudou neste aspecto para a especificação do EJB 2.1. Ou seja, se deseja que o Transaction Manager controle toda a transação, tem que garantir que todos os seus provedores de serviços podem ser anexados ao JTA. Pode ser que a definição manual possa estar atrapalhando a mesma.

Uma pergunta, não conheço seu projeto mas haveria algum problema se alterrase seu DAO para um Session Bean Stataless e ussase a atribuição do PersistenteContexte por injeção de dependência pelo container assim:




Dai chamaria seu DAO também por Injecção de dependência assim:



Espero que lhe ajude em algo!



[MSN]
Maracuja
GUJ Ranger
[Avatar]

Membro desde: 28/03/2006 10:18:44
Mensagens: 940
Localização: Behind the screen
Offline

Então, é justamente o que estou dizendo, controlando a transação na "mão" em um bean BMT funciona numa boa, o problema é mesmo com o CMT.

Existem dois casos.

Bean BMT com controle de transação feito na mão que eu ja fiz e funciona numa boa.

Bean CMT, sem fazer o controle transacional na mão, ao tentar pesistir, ocorre o erro.



Concerteza, entre minhas brincadeiras ja fiz e funciona perfeitamente se eu injtar o EntityManager no meu Bean, ou até usar no meu DAO um outro
bean... a questão é que queria entender melhor esta situação específica!!!!

Mesmo que eu fizesse isso



ocorre o mesmo erro... pq neste momento parece não haver uma transação em andamento....

"Nunca deixarei de reclamar, mas espero reclamar de coisas melhores a cada dia..." Um amigo muito sabio
andre_salvati
GUJ Ranger

Membro desde: 02/06/2005 16:28:38
Mensagens: 939
Offline

Maracuja wrote:

Concerteza, entre minhas brincadeiras ja fiz e funciona perfeitamente se eu injtar o EntityManager no meu Bean, ou até usar no meu DAO um outro
bean... a questão é que queria entender melhor esta situação específica!!!!



A questão é: pq vc precisa dessa situação específica, se o AS já injeta o EntityManager para vc!? Ou seja, qual a vantagem dessa abordagem!?

Ajude na criação do StackOverflow em português!!!

http://area51.stackexchange.com/proposals/23539/software-development-in-portuguese?referrer=tI8Uon7RDszY236h5e0UuA2


http://www.empresadigital.inf.br
http://twitter.com/afsalvati
Maracuja
GUJ Ranger
[Avatar]

Membro desde: 28/03/2006 10:18:44
Mensagens: 940
Localização: Behind the screen
Offline

Eu queria que o Container gerencia-se a transação para mim; porém mantendo esta arquitetura....


"Nunca deixarei de reclamar, mas espero reclamar de coisas melhores a cada dia..." Um amigo muito sabio
andre_salvati
GUJ Ranger

Membro desde: 02/06/2005 16:28:38
Mensagens: 939
Offline


Sim, e qual a vantagem dessa abordagem?

Maracuja wrote:





Não é mais fácil injetar o EntityManager?

Ajude na criação do StackOverflow em português!!!

http://area51.stackexchange.com/proposals/23539/software-development-in-portuguese?referrer=tI8Uon7RDszY236h5e0UuA2


http://www.empresadigital.inf.br
http://twitter.com/afsalvati
Maracuja
GUJ Ranger
[Avatar]

Membro desde: 28/03/2006 10:18:44
Mensagens: 940
Localização: Behind the screen
Offline

Talvez, se conseguisse injetar aí o EntityManager, mas só consigo injetar isso no meu EJB!!!!

Tentei injetar no DAO, mas recebi um null. Injetando no EJB funciona na boa.

Porém acredito que mesmo que eu injetasse o entity manager, perigava eu ainda receber um



Acho que vou tranformar meus DAO's em EJB's tb e td será resolvido. eu não queria.... bom ainda to avaliando novas abordagens...


"Nunca deixarei de reclamar, mas espero reclamar de coisas melhores a cada dia..." Um amigo muito sabio
andre_salvati
GUJ Ranger

Membro desde: 02/06/2005 16:28:38
Mensagens: 939
Offline

Maracuja wrote:

Acho que vou tranformar meus DAO's em EJB's tb e td será resolvido. eu não queria.... bom ainda to avaliando novas abordagens...


Mas é isso mesmo, dê uma olhada...

http://www.hibernate.org/328.html

Ajude na criação do StackOverflow em português!!!

http://area51.stackexchange.com/proposals/23539/software-development-in-portuguese?referrer=tI8Uon7RDszY236h5e0UuA2


http://www.empresadigital.inf.br
http://twitter.com/afsalvati
mrmarcondes
Thread.start()

Membro desde: 02/08/2007 09:50:01
Mensagens: 34
Offline

Boa noite Maracuja,

estou participando de um projeto onde desenhamos essa mesma arquitetura de camadas e estamos enfrentando o mesmo problema em relacao a transacao gerenciada pelo container. Voce chegou a alguma conclusao sobre isso? Como propagar a transacao a partir de um session bean(delegate) ate a camada DAO(POJO)?

Obrigado,
Marco.
Maracuja
GUJ Ranger
[Avatar]

Membro desde: 28/03/2006 10:18:44
Mensagens: 940
Localização: Behind the screen
Offline

Bom, cheguei a conclusão que não tem jeito... se vc quiser utilizar uma transação CMT com esta arquitetura vc teria que utilizar um EntityManager injetado pelo container e seta-lo na ThreadLocal de um PersistenceUtil (sic) !!!!!

Só fazendo gambiarra!!!!

na real.... só ... como sugerido pelo Taz

http://www.hibernate.org/328.html

Writing DAOs as managed EJB 3.0 components




"Nunca deixarei de reclamar, mas espero reclamar de coisas melhores a cada dia..." Um amigo muito sabio
mrmarcondes
Thread.start()

Membro desde: 02/08/2007 09:50:01
Mensagens: 34
Offline

Maracuja,

obrigado pelo pronta resposta. Isso e decepcionante, mas vou dar uma olhada com calma no site indicado.

Abracos,
Marco.
thiago_santos
Thread.start()
[Avatar]

Membro desde: 28/12/2006 11:02:18
Mensagens: 41
Offline

Olá a todos....
Tenho uma aplicação EJB3 rodando dentro do Jboss4.0.5GA, onde estou numa situação assim: minha aplicação tem uma rotina que salva um registro numa tabela de um outro banco através de um DBLINK, e nessa tabela tem um trigger que que ao cair registro lê o mesmo. Mas o problema é que quando eu do um flush() na aplicação para salvar o registro é ativada a trigger onde da um erro na trigger e acaba retornando uma excessão para o jboss quebrando toda a sessão dele, assim não cosigo remover esse registro que está dando erro e a aplicação entra num loop infinito. Como faço para capturar essa excessão sem quebrar as transações do jboss? Alguém poderia me ajudar? Lembrando que a trigger nós aqui não mexemos, e o cliente não quer alterar para corrigir esse erro.
Tecnoage
GUJ Master

Membro desde: 13/03/2005 23:18:07
Mensagens: 1723
Localização: SP
Offline

Maracuja wrote:Bom, cheguei a conclusão que não tem jeito... se vc quiser utilizar uma transação CMT com esta arquitetura vc teria que utilizar um EntityManager injetado pelo container e seta-lo na ThreadLocal de um PersistenceUtil (sic) !!!!!

Só fazendo gambiarra!!!!

na real.... só ... como sugerido pelo Taz

http://www.hibernate.org/328.html

Writing DAOs as managed EJB 3.0 components





Exato. Estamos usando uma arquitetura parecida aqui... utilizando DAOS como EJBs. Fica estranho mesmo a arquitetura. E até chego a perguntar: Até aonde vale a pena utilizar DAO numa arquitetura dessas?

Arquiteto de Software
Sysped Solutions
R3 SAP CAT-83, NF-e, ECD, EFD, CT-e, MANAD, IN86
www.sysped.com.br
[Email] [WWW] [MSN]
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

Galera, olhando este post vejo que tem algo a ver com a questão que estou enfrentando.
No meu caso, todos os objetos envolvidos são EJBs.... Tenho um EJB Statefull que chama vários EJBs Stateless, e gostaria que as transações fossem iniciadas e finalizadas no Stateful... ou seja, as transações deveriam ser propagadas para os Stateless.
Estava fazendo com injeção de dependência e tudo estava beleza, mas um requisito da aplicação me força a mudar parâmetros do EntityManager em tempo de execução, para pegar conexões de acordo com o usuário logado (cada usuário do sistema tem um usuário paralelo no banco).
Desta forma, preciso pegar minhas referências de EntityManager da seguinte forma:




onde props é um Map com as propriedades que tenho que passar para o EntityManager.


dessa forma, preciso criar a transação com entityManager.getTransaction().begin;

a questão é como propagá-la para os demais EJB sem estado.


alguma sugestão?



[]'s





Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
 
Índice dos Fóruns » Java Enterprise Edition (Java EE)
Ir para:   
Powered by JForum 2.1.8 © JForum Team