Atomicidade entre duas operações (Spring + JPA - createNativeQuery)  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
paulohbmetal
GUJ Ranger
[Avatar]

Membro desde: 28/08/2003 18:19:45
Mensagens: 760
Localização: Goiânia - Goiás
Offline

Olá pessoal, blz? Seguinte, estou com um problema me enchendo o saco aqui. Estou criando um aspecto para auditar operações de escrita no banco para todas as aplicações. Mas a única coisa que esta rotina faz é registrar o usuário da aplicação na sessão do banco e uma trigger existente nas tabelas pega esse usuário e faz o resto do serviço. Então, para registrar esse usuário no banco, chamo uma procedure com o createNativeQuery do JPA. O problema é que me parece que as operações estão sendo executadas em transações/conexões diferentes pois, quando a inclusão é feita, recebo uma exception falando que a trigger não encontrou o usuário registrado.

O método que é interceptado fica +/- assim:



O método do aspecto também está com o @Transacional (como o acima). Depurando o código, percebi que as operações estão sendo executadas em EntityManagers (instâncias) diferentes. É normal?

Bom, se quiserem mais detalhes, posso passar. Valeu!

Paulo Melo
JavaMetal - GoJava - JavaFree.org - Ubuntu Linux - Rising Cross
Sun Certified Java Programmer
Bacharel em Ciência da Computação
Especialista em Análise e Projetos de Sistemas de Informação
________________________________
"Que a cruz sagrada seja minha luz!!"
[Email] [WWW]
jakefrog
GUJ Expert
[Avatar]

Membro desde: 22/01/2007 22:00:53
Mensagens: 4191
Offline

Pode ser pq a trigger está disparando antes da transação realizar o commit.

Você poderia iniciar uma nova transação para persistir apenas o dado necessário para a trigger, ao finalizar o método seria feito o commit e o restante do processo continuaria na mesma transação.

This message was edited 1 time. Last update was at 04/01/2012 09:25:08


Meu blog sobre java uaiHebert.com
Conceitos OO - Diga, não pergunte!, Lei de Demeter
TDD Primeiros Passos, JUnit com HSQLDB, JPA e Hibernate, Cobertura de testes com JUnit Ant e Emma, Cobrindo seus testes com Cobertura, JUnit, HSQLDB, JPA
Código Limpo: Partes: 01,02,03,04,05
Web/JSF - Criando um WebServer, Tratando Exceções, Autenticação de Usuários (Filter/Servlet), JSF - Hello World, AutoComplete, JSF: Converter e Bean Auto Complete, Validação de Login de Usuário com JSF e JAAS, JSF Exibindo Objeto e Mensagens após Redirect, JSF Exemplos Simples com Ajax, JSF Parametros por Get Request RESTFullAplicação Web Completa JSF EJB JPA JAAS, Lazy JSF Datatable Pagination (Primefaces)
Design Pattern - Strategy, Design Pattern - Observer (Parte 01), Design Pattern - Observer (Parte 02)
Business (JPA)- Hibernate 3 com JPA 2, Create schema script: Ant, Hibernate 3 e JPA 2, TableGenerator Chave Primária Simples, SequenceGenerator,Chave Primária Composta, Mapeando Datas (Date) e Enum, Mapeando Duas Tabelas em uma Classe, @OneToOne Unidirecional e Bidirecional, @OneToMany e @ManyToOne Unidirecional e Bidirecional, @ManyToMany Unidirecional e Bidirecional, Ordernando listas e utilizando Map como atributo mapeado,Uma tabela por herança, JPA Uma Classe por Sub-Classe, JPA Consultas e Dicas, [HOT]Quatro soluções para LazyInitializationException[HOT]

SCJP(1.6 - Ingles - 29/12/2009)
SCWCD(1.5 - Ingles - 30/06/2010)

Vamos em frente que atrás vem gente!
paulohbmetal
GUJ Ranger
[Avatar]

Membro desde: 28/08/2003 18:19:45
Mensagens: 760
Localização: Goiânia - Goiás
Offline

jakefrog wrote:Pode ser pq a trigger está disparando antes da transação realizar o commit.


Cara, pode acreditar, vc acabou de fazer a boa ação do dia. Putz! Matou a pau!!!

Era isso mesmo!


Paulo Melo
JavaMetal - GoJava - JavaFree.org - Ubuntu Linux - Rising Cross
Sun Certified Java Programmer
Bacharel em Ciência da Computação
Especialista em Análise e Projetos de Sistemas de Informação
________________________________
"Que a cruz sagrada seja minha luz!!"
[Email] [WWW]
paulohbmetal
GUJ Ranger
[Avatar]

Membro desde: 28/08/2003 18:19:45
Mensagens: 760
Localização: Goiânia - Goiás
Offline

Engraçado, a coisa parece que funciona para umas situações e para outras não. Entrei em contato com os BDA's e me informaram que as solicitações (execução da procedure e insert) estão sendo executadas em connections diferentes. Estou achando muito sinistro. O aspecto que faz a auditoria está em um jar diferente, sabem se pode ocorrer algum problema com isso?

Valeu!

Paz e bem!

Paulo Melo
JavaMetal - GoJava - JavaFree.org - Ubuntu Linux - Rising Cross
Sun Certified Java Programmer
Bacharel em Ciência da Computação
Especialista em Análise e Projetos de Sistemas de Informação
________________________________
"Que a cruz sagrada seja minha luz!!"
[Email] [WWW]
paulohbmetal
GUJ Ranger
[Avatar]

Membro desde: 28/08/2003 18:19:45
Mensagens: 760
Localização: Goiânia - Goiás
Offline

Galera, percebi que se retirar o



da declaração do EntityManager, tudo funciona numa boa mas, se colocar é problema na certa. A dúvida é se o EXTENDED estaria forçando a busca de uma nova conexão (que já foi confirmado pelos DBA's).

Alguém mais já teve problema parecido?

Editado: Antes que me perguntem o EXTENDED está lá para evitar os famigerados LazyInicializationException...

This message was edited 1 time. Last update was at 01/02/2012 11:57:44


Paulo Melo
JavaMetal - GoJava - JavaFree.org - Ubuntu Linux - Rising Cross
Sun Certified Java Programmer
Bacharel em Ciência da Computação
Especialista em Análise e Projetos de Sistemas de Informação
________________________________
"Que a cruz sagrada seja minha luz!!"
[Email] [WWW]
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team