Porque não consigo remover um objeto sessao?

8 respostas
contrabando

Seguinte:

//abro uma sessao
Session sessao sf.openSession();
//seto o fluxhMode para NEVER porque depois de remover um 
//objeto da sessao se der algum outro erro nao vai confirmar a 
//remoção
sessao.setFlushMode(FlushMode.NEVER);
//verifico se o objeto esta na sessao
sessao.contains(obj);//retorna TRUE
//removo o objeto da sessao
sessao.delete(obj);
//verifico novamente se o objeto esta na sessao
sessao.contains(obj);//continua retornando TRUE :(

porque mesmo depois de remover ele continua na sessao? :frowning:
o que tenho que fazer pra remover? :?:
alguem poderia me dar um luz? :slight_smile:

8 Respostas

drix

Talvez a solução seja o metodo: refresh()

Blz :wink:

contrabando

valeu drix mas nao funcionou

//F5 na sessao
sessao.refresh(obj);
//verifico se o obj esta la
sessao.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. :frowning:

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 ]

Session sessao = null;
        [b]Transaction transacao = null;[/b]
        
        try {
            sessao =  sf.openSession();
           [b] transacao = sessao.beginTransaction();[/b]
            
//          percorrendo a lista dos objetos removidos
            for (Objeto obj : objsRemovidos) {
                
                deletarObj(sessao, obj);
                [b]sessao.flush();[/b]
            }
            
//          percorrendo a lista dos objetos que tiveram seus dados alterados
            for (Objeto obj : objsAlterados) {

//              verifica se o objeto não está na lista dos removidos
                if (!objetosRemovidos.contains(obj) )  {
                                 
                    adicionarOuEditarObj(sessao, obj);
                    [b]sessao.flush();[/b]
                }
                
            }
            
//          percorrendo a lista dos objetos adicionados ha ela
            for (Objeto obj : objsAdicionados) {
                
                adicionarOuEditarObj(sessao, obj);
                sessao.flush();
            }
            
//          salvando as alterações
            [b]transacao.commit();[/b]
        } catch (HibernateException e) {
            
            throw new MinhaExcecao("Erro." + e.getMessage());
        } catch (Exception e) {

            try {

                [b]efetuarRollback(transacao, e, "Erro.");[/b]
            } catch (Exception e1) {

                e.printStackTrace();
            }
        } finally {

            try {
                
                finalizarSessaoHibernate(sessao);
            } catch (MinhaExcecao e) {
                
                throw new MinhaExcecao(e.getMessage());
            }
        }

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 :smiley: :smiley:

Criado 7 de julho de 2006
Ultima resposta 10 de jul. de 2006
Respostas 8
Participantes 5