Hibernate - Método para salvar Registro

3 respostas
L

Tenho no meu sistema um método para salvar registros

/**
     * Inclui os dados no banco segundo o objeto passado como argumento.
     * @param obj objeto a ser incluido
     * @return true se incluiu ou false se deu erro
     */
    private boolean incluirRegistro(Object obj) {
        boolean retorno = true;
        Session sessao = HibernateUtil.getSessionRemota();
        sessao.beginTransaction();
        try {

            sessao.save(obj);
            sessao.getTransaction().commit();
        

        } catch (Exception ex) {
            sessao.getTransaction().rollback();
            mensagem = TrataException.trataException(ex);
            retorno = false;
        } finally {
            sessao.close();
        }


        return retorno;
    }

no qual retorna true se salvou e false se não salvou…até aí beleza…
Minha dúvida seria…por exemplo se eu tiver que inserir uma lista de objetos…por exemplo uns mil objetos para o banco…
então se eu usasse esse método, ele iria abrir umas 1000 sessões?..ou o hibernate faz esse controle de sessão e reutiliza a que está ativa?

seria então correto eu abrir a sessao antes de enviar a listagem para o banco?
ficando o código assim;;

private boolean incluirRegistro(List lst) {
        boolean retorno = true;
        Session sessao = HibernateUtil.getSessionRemota();
        sessao.beginTransaction();
        try {


           for (Object obj:lst){
            sessao.save(obj);
         }        
    sessao.getTransaction().commit();
        

        } catch (Exception ex) {
            sessao.getTransaction().rollback();
            mensagem = TrataException.trataException(ex);
            retorno = false;
        } finally {
            sessao.close();
        }


        return retorno;
    }

3 Respostas

D

creio eu que ira fazer na mesma sessao pois vc passa uma lista e objetos e ele nao saira do for enquanto nao acabar. pois a sessão so é fechado no bloco finally

L

Ok…mas seria correto eu fazer assim
Sabendo que a listagem recebida é de mais de mil objetos?

public void incluirTodos(List lst){
     
     for(Object obj: lst){
            if (!incluirRegistro(obj))
                 System.err.println("erro ao incluir o registro");
      }


}

    /** 
         * Inclui os dados no banco segundo o objeto passado como argumento. 
         * @param obj objeto a ser incluido 
         * @return true se incluiu ou false se deu erro 
         */  
        private boolean incluirRegistro(Object obj) {  
            boolean retorno = true;  
            Session sessao = HibernateUtil.getSessionRemota();  
            sessao.beginTransaction();  
            try {  
      
                sessao.save(obj);  
                sessao.getTransaction().commit();  
              
      
            } catch (Exception ex) {  
                sessao.getTransaction().rollback();  
                mensagem = TrataException.trataException(ex);  
                retorno = false;  
            } finally {  
                sessao.close();  
            }  
      
      
            return retorno;  
        }
D
private boolean incluirRegistro(List lst) {  
       boolean retorno = true;  
       Session sessao = HibernateUtil.getSessionRemota();  
       sessao.beginTransaction();  
       try {  
  
  
          for (Object obj:lst){  
           sessao.save(obj);  
        }          
   sessao.getTransaction().commit();  
         
  
       } catch (Exception ex) {  
           sessao.getTransaction().rollback();  
           mensagem = TrataException.trataException(ex);  
           retorno = false;  
       } finally {  
           sessao.close();  
       }  
  
  
       return retorno;  
   }

acredito que desta forma seja mais correto. só nao sei se o sessao.getTransaction().commit() é dentro do for tb.

Criado 9 de março de 2012
Ultima resposta 9 de mar. de 2012
Respostas 3
Participantes 2