Hibernate não grava no BD!

1 resposta
vinny767

Bom dia, pessoal,

Estou passando por um problema estranho… Tenho um formulário na minha aplicação onde eu cadastro uma pessoa. Eu preencho todos os campos, chamo o metodo cadastrar();, ele é executado sem problemas, o struts exibe a página de sucesso, eu volto até a table com os registros e, de fato, ele está lá, como se tivesse sido gravado.

Mas quando eu vou no banco de dados (postgres), a tabela está vazia. Eu clico no registro e dá erro (claro, ele não foi gravado).

O mais estranho é que as vezes eu consigo salvar os dados normalmente, ou seja, é um problema intermitente.
Alguem já passou por algo parecido?

Eu utilizo um framework proprio da empresa. Todos os metodos estão padronizados. Vou postar o exemplo de um metodo de cadastro e um de exclusao (exclusão também tá dando pau, ele some com o registro do sistema mas ele continua no banco de dados).

public void save(Entity entity){
        Session session = factory.getCurrentSession();
        factory.beginTransaction();
        
        try {
            session.save(entity);
            session.flush();
            if(isLocalScope()){
                factory.commit();
            }
        } catch (Exception ex){
            factory.rollback();
            throw new DAOException("Falha ao salvar objeto.", ex);
        }
    }
public void delete(Entity entity){
        Session session = factory.getCurrentSession();
        factory.beginTransaction();
        
        try {
            session.delete(entity);
            session.flush();
            if(isLocalScope()){
                factory.commit();
            }
        } catch (Exception ex){
            factory.rollback();
            throw new DAOException("Falha ao excluir objeto.", ex);
        }
    }

Eu nao entendi para que serve o metodo isLocalScope, mas ele sempre passa direto. Mesmo não executando o commit, ele custuma gravar os objetos no banco. Se alguem suber o porque, eu agradeceria! :smiley:

Valeu pessoal.;

1 Resposta

Lavieri

o problema é justamente esse... sem o commit() ele não grava no banco... vc vê os objetos, na sessão do hibernate ele vai existir, vc vai conseguir pesquisar no seus sitema, ate ele ser fechado, depois puff, o que não foi comitado, so fica na tranzação, e tudo é perdido, e nada vai pro banco...

se vc não sabe o que é o metodo isLocalScope() então procure saber... o que posso te falar, pela inferencia do nome, é um método que verifica se vc esta em uma tranzação, ou seja, se vc esta adcionando salvando, apagando, varios objetos de uma vez, e só depois irá fechar a tranzação, ou se vc não esta em uma tranzação, e por isso ele comita ali mesmo...

procure seus colegas na empresa, busque saber como o método é implementado, olhe a API da sua empresa e veja como é

eu não sei como o pessoal ai impelementa esse método, mas pra no meu repositorio eu faço assim

public void save(Entity entity){  
       Session session = factory.getCurrentSession();
       boolean needCommit = !session.getTransaction().isActive(); //se não há tranzação ativa então eu vou commitar
       if (needCommit) {
           factory.beginTransaction();  //se eu preciso comitar, então tb preciso abrir a tranzação
                                        //caso contrario, a tranzação ja estaria aberta, e não precisa inicia-la
       }
         
       try {  
           session.save(entity);  
           session.flush();  
           if(needCommit){  
               factory.commit();  
           }  
       } catch (Exception ex){
           if (needCommit) {
               factory.rollback(); //veja bem, se o scopo da tranzação não é sua, então vc não deve dar rollback
                                   //o dono da tranzação que deve tratar a exceção, e dar rollback quando for necessario.
           }
           throw new DAOException("Falha ao salvar objeto.", ex);  
       }  
   }
Criado 11 de maio de 2009
Ultima resposta 12 de mai. de 2009
Respostas 1
Participantes 2