Session hibernate não limpa quando alterada por outra máquina

Seguinte: eu tenho um sistema que é acessado por vários usuários, se caso um deles alterar algum dado, mesmo que o outro der session.clear() , simplesmente não reconhece a mudança. Por exemplo: existe uma entidade Servico que tem um atributo token do tipo Usuario. Então, o Usuario A manda o token para o B, via JMS o sistema do A manda uma mensagem avisando o B que está agora com o token. Nessa situação, o sistema usa o session.clear() mas mesmo assim naum atualiza do banco de dados. Estou usando o esquema de uma session para a aplicação toda.

Oi,

Uma pequena correção: não existe uma sessão para a aplicação toda, compartilhada pelos usuários. O mais parecido com isso seria guardar os dados no escopo da aplicação (que não se manipula através do objeto “session”).

Poderia esclarecer em mais detalhes como é que é feita sua solução?

Na realidade é um sistema Swing. Cada usuário tem sua própria sessão, que no caso seria a sessão do hibernate, achu q isso naum ficou claro na minha mensagem. Vou exemplificar mais:

    Na minha tabela tab_servico eu tenho um atributo chamado token, que eh um FK para a tab_usuario. Essas duas tabelas ficaram mapeadas como Servico e Usuario, sendo que na classe Servico eu tenho um getToken() que me retorna o objeto Usuario que está com o token. Muito bem, existe uma funcionalidade que muda o token de um usuário para o outro. Por exemplo, o Servico de código 1 tem como token agora o Usuario de código 10. O Usuario 10, já terminou as Tarefas que lhe cabem no Servico 1 e tem que passar o token para o próximo Usuario que dará sequência ao Servico 1, então ele passa o token para o Usuario de código 20. O Usuario 10 ao passar o token para Usuario 20, automaticamente executa a alteração e a mudança é percebida automaticamente pelo sistema do Usuario 10, que envia uma mensagem JMS, para o sistema do Usuario 20, que recebe a mensagem JMS. Nesse ponto é que está o erro: quando recebe a mensagem, eu dou um session.clear() no sistema do Usuario 20, que NÃO reconhece a mudança do token do Usuario 10 para o Usuario 20. Para contornar o problema eu preciso session.disconect() e inicializar a session novamente.

Eu estou utilizando um esquema de session persistente onde eu tenho uma session praticamente o tempo todo aberta no sistema. Li um artigo sobre isso e dizia que minimizava erros de duplicidade e de durty session, além do fato de evitar o LazyInitializationException.

Agradeço a ajuda de qualquer forma.

Realmente não tem nada a ver com o que eu estava pensando hehe

Mas voltando ao assunto: Quando chega o JMS notificando sobre a mudança a aplicação faz um session.clear().
Só que o mais importante é: você está mandando o hibernate atualizar o objeto a partir do banco de dados? O .clear() nao é suficiente para isso, deveria ser feito algo do tipo:

session.refresh(objeto); // Recarrega o objeto do banco
//session.clear(); // Na verdade o clear nao é necessario nessa situacao.

vish…eu tinha entendido qdo li http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html#clear() que isso limpava o cache forçando o hibernate a buscar no banco novamente. Entendi errado entaum? vou fazer o teste e depois eu respondo.

Embora lendo http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html#refresh(java.lang.Object) ele diz:

Se entendi bem não é aconselhável no meu caso, já que uso uma session longa, mas não entendi por que.

O negócio do clear é assim: quando a sessão tem objetos que foram alterados (set nos atributos) mas não foram salvos, ela fica “suja” (ver o método session.isDirty() ). O clear serve para limpar a sessão suja, desfazendo essas alterações pendentes. Então ele volta ao estado original da base no sentido que desfaz suas alterações locais, mas não significa re-ler do banco as alterações feitas fora da aplicação.

E o refresh eu também não entendi porque o documento está dizendo isso…

Outra opção também é recarregar o objeto com load ou get.

De qualquer forma, testa aí e vamos ver o que acontece!