Consegui simular a situação aqui, esse erro acontece na seguinte situação:
Estou com a aplicação cliente aberta, reinicializo o Tomcat, com a mesma aplicação que estava aberta eu crio um novo cliente ele não é salvo, quando tento salva-lo novamente acontece o erro do StaleStateException (porque o objeto não estava na sessão - o que confirma o erro de não salvar).
Habilitei as estatisticas do SessionFactory:
Quando salvo um cliente em uma situação normal: 1 transação aberta, 1 com sucesso
Quando salvo um cliente após o restart do Tomcat: 2 transações abertas, 1 com sucesso (no finally do bloco ao pegar a variavel wasCommited me informava que a transação foi efetuada com sucesso…)
Rodei essas mesmas simulações com o Hibernate Profiler para verificar quais das transações falhava:
->Situação normal (tudo ocorre normalmente):
begin transaction with isolation level: unknown
INSERT INTO cliente
INSERT INTO revinfo
INSERT INTO cliente_AUD
commit transaction
->Após o restart acontece um erro ao salvar as informações do Envers então é feito o rollack na transação (cancelando a alteração feita de salvar o cliente).
begin transaction with isolation level: unknown
INSERT INTO cliente
rollback transaction
ERROR: exception calling user Synchronization
commit transaction porque deu o commit aqui ?!?!
Então parece que o Envers é que está escondendo a exception:
Achei uma situação aqui:
http://community.jboss.org/thread/149037?start=0&tstart=0
Em um dos posts: “When hibernate executes the transaction synchronization mechanism, any exception throwed by any implementation of the Synchronization interface (like AuditSync) is discarded by hibernate. So the exception does not propagates.”
Ao desabilitar o Envers simulei ambas as situações e TUDO COM SUCESSO!
Ok… o problema DEVERIA estar no Envers.
Criei um projeto novo para simular essa situação, e então iria entrar em contato com os desenvolvedores.Porém, ao simular nesse projeto que criei TUDO COM SUCESSO… (mesmo com Envers ativado…)
Enquanto estava escrevendo esse post achei a solução
Mas fica todo o relato…
Então, me lembrei que no Envers uso uma Entidade extendida para também gravar quem é o usuário que está logado.Coloquei-a no projeto de exemplo e não funcionou.
O erro acontece, pois ao salvar qualquer entidade pego o nome do usuário que está armazendo.Mas como o tomcat foi reinicializado esse objeto não está mais lá e acontece o erro. NullPointerException (que ficou escondida…) como essa exceção é pega é feito o rollback na transação cancelando a alteração/inclusão.
Antes deixava meu objeto no FlexClient (que morria no restart)
FlexContext.getFlexClient().setAttribute(“usuario”, usuario_logado.getUsu_nome());
Agora deixo no FlexSession(Sessão que é para ser a mesma que o HttpSession)
FlexContext.getFlexSession().setAttribute(“usuario”, usuario_logado.getUsu_nome());
Problema Resolvido!