//abro uma sessaoSessionsessaosf.openSession();//seto o fluxhMode para NEVER porque depois de remover um //objeto da sessao se der algum outro erro nao vai confirmar a //remoçãosessao.setFlushMode(FlushMode.NEVER);//verifico se o objeto esta na sessaosessao.contains(obj);//retorna TRUE//removo o objeto da sessaosessao.delete(obj);//verifico novamente se o objeto esta na sessaosessao.contains(obj);//continua retornando TRUE :(
porque mesmo depois de remover ele continua na sessao?
o que tenho que fazer pra remover? :?:
alguem poderia me dar um luz?
//F5 na sessaosessao.refresh(obj);//verifico se o obj esta lasessao.contains(robj);//ainda TRUE
já estou quase desistindo
pra que serve sessao.remove se nao remove nada?
WalterIM
Tenho a impressão que vc está misturando alhos e bugalhos. O session.delete remove seu objeto persistente do banco, e não o transiente da sessão. O session.contains verifica se o objeto transiente está associado a essa sessão, e nesse caso mostrado ele ainda está.
Se você quer verificar se o objeto foi removido do banco, use session.get, por outro lado se o que vc quer é remover o objeto da sessão, use session.evict.
Pedrosa
Tente assim:
HttpSession sessao = request.getSession();
//crio a sessao
sessao.setAttribute("teste","Teste sessao");
//removo a sessao
sessao.removeAttribute("teste");
contrabando
com sua explicação eu tenho certeza disso.
WalterIM:
O session.delete remove seu objeto persistente do banco, e não o transiente da sessão. O session.contains verifica se o objeto transiente está associado a essa sessão, e nesse caso mostrado ele ainda está.
Se você quer verificar se o objeto foi removido do banco, use session.get, por outro lado se o que vc quer é remover o objeto da sessão, use session.evict.
tá isso agora eu entendí, mas suponhamos que eu usei o sessao.remove (nao dei flush), e logo abaixo eu fizer uma pesquisa usando o sessao.CreateCriteria procurando por objetos que tenham uma propiedade com o mesmo valor do objeto que eu removí, eu vou encontrar certo?
como eu faço essa mesma busca porem sem encontrar o objeto removido?
Mauricio_Linhares
contrabando:
tá isso agora eu entendí, mas suponhamos que eu usei o sessao.remove (nao dei flush), e logo abaixo eu fizer uma pesquisa usando o sessao.CreateCriteria procurando por objetos que tenham uma propiedade com o mesmo valor do objeto que eu removí, eu vou encontrar certo?
como eu faço essa mesma busca porem sem encontrar o objeto removido?
Se você não deu commit na transação, é provável que você receba o objeto “removido” do banco de dados, mas isso vai depender de como está o nível de isolamento da transaão. O melhor é fazer o commit da transação o mais rápido possível.
Outra coisa, chamar flush na sessão não obriga ela a enviar as informações ao banco de dados.
WalterIM
tá isso agora eu entendí, mas suponhamos que eu usei o sessao.remove (nao dei flush), e logo abaixo eu fizer uma pesquisa usando o sessao.CreateCriteria procurando por objetos que tenham uma propiedade com o mesmo valor do objeto que eu removí, eu vou encontrar certo?
como eu faço essa mesma busca porem sem encontrar o objeto removido?
Se não executar o flush, pode ser que vc ainda encontre o objeto… Depende da capacidade do driver em relação ao “batch update” e da configuração do Hibernate. Use o flush, o flush não é o commit, vc ainda pode desistir da transação com o rollback.
Se você executar o session.flush() vc garante que os comando sql foram enviados ao banco, e mesmo antes do commit, suas novas pesquisas não vão encontrar o danado do objeto removido. O isolamento default mais comum nos bancos relacionais funciona assim.
Acho que obriga sim, pois o flush faz com que os estados transiente e persistente sincronizem. Ele inclusive é chamado pelo transaction.commit().
O flush() é necessário pois o Hibernate acumula vários comandos sql antes de enviá-los ao banco de dados para fazer uso de uma característica de performance do jdbc, o “batch update”. Isso naturalmente é configurável.
contrabando
claro que nao remove nada se o cara nao sabe pra que serve a ferramenta(to falando de mim mesmo).
Eu relamente estava confundindo as coisas, mas graças as dicas de vocês conseguí fazer o que eu queria
Solução adotada: Obs: reparem nas linhas entre as tags [ b ] [ / b ]
obrigado amigos sabia que me ajudariam
alem de ter conseguido resolver meu problema acabei descobrindo que devo estudar mais o hibernate, ainda sei pouco desta ferramente que muitos adoram
Obrigado mais uma vez