[RESOLVIDO]Apagar todos os dados de uma tabela em JPA - Hibernate

5 respostas
carlosalbertosales

Olá bom dia pessoal, estou criando um método que apaga todos os dados de uma determinada tabela em jpa-Hibernate
Segue o código.

public void excluirTodos(Cliente cliente) {
        long init = 0;
        long end;
        long diff;
        init = System.currentTimeMillis();
        open();
        try {
            em.createNativeQuery("DELETE FROM Cliente");
            em.createNativeQuery("ALTER SEQUENCE GEN_CLIENTE RESTART WITH 0");
        } catch (Exception e) {
            System.out.println("Deu erro!" + e);
        }
        close();
        end = System.currentTimeMillis();
        diff = end - init;
        System.out.println("Tempo de resposta = " + (diff / 1000.0) + " segundos em JPA - Hibernate");
    }

Utilizei o createNativeQuery pelo fato de que não sei se o tem algo em jpa que faça sozinho.
No JDBC esse código ta funcionando perfeitamente veja o código em JDBC.

public void excluiTodosCliente(Cliente cliente) {
        long init = 0;
        long end;
        long diff;
        try {
            init = System.currentTimeMillis();
            open();
            System.out.println("antes......");
            int del = stmt.executeUpdate("DELETE FROM Cliente");
            String sqlGen = "ALTER SEQUENCE GEN_CLIENTE RESTART WITH 0";
            del = stmt.executeUpdate(sqlGen);
        } catch (SQLException e) {
            System.out.println("Erro na slq! " + e);
        } finally {
            close();
            end = System.currentTimeMillis();
        }
        diff = end - init;
        System.out.println("tempo inicia " + init);
        System.out.println("tempo final " + end);
        System.out.println("Tempo de resposta = " + (diff / 1000.0) + " segundos em JDBC");
    }

No aguardo .

5 Respostas

Tchello

Repare que o método createQuery retorna um objeto da classe Query:

http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#createQuery(java.lang.String)

Logo, a query está apenas criada, o que não significa executada. Compreende?

Para finalizar, você precisa invocar o método executeUpdate do objeto Query:

http://docs.oracle.com/javaee/6/api/javax/persistence/Query.html#executeUpdate()

Hebert_Coelho

Essa ação não é suportada pelo JPA.

Ela não seria portável entre banco de dados.

Você poderia utilizar NativeQuery, como você fez ou executeUpdate como o Tchello disse.

Você precisa entender como funciona o JPA mano, esse seu levantamento sobre JDBC x JPA vai ter muitas informações que podem ser levantadas de modo errado.

Essas informações pode levar a dados errados. =/

carlosalbertosales

então eu coloquei o createNativeQuery, e agora com o .executeUpdate
mas deu erro.
“javax.persistence.TransactionRequiredException: Executing an update/delete query”

em.createNativeQuery("DELETE FROM Cliente").executeUpdate();
            em.createNativeQuery("ALTER SEQUENCE GEN_CLIENTE RESTART WITH 0").executeUpdate();

o que estou fazendo de errado?

Hebert_Coelho

carlosalbertosales:
então eu coloquei o createNativeQuery, e agora com o .executeUpdate
mas deu erro.
“javax.persistence.TransactionRequiredException: Executing an update/delete query”

em.createNativeQuery("DELETE FROM Cliente").executeUpdate();
            em.createNativeQuery("ALTER SEQUENCE GEN_CLIENTE RESTART WITH 0").executeUpdate();

o que estou fazendo de errado?

Leia a mensagem de erro…
javax.persistence.TransactionRequiredException

carlosalbertosales

Obrigado a todos aqui neste porque nos ensina a pescar e não da o peixe.
o problema todo era a falta de abrir uma transação

em.getTransaction().begin();

o código ficou assim.

public void excluirTodos(Cliente cli) {
        long init = 0;
        long end;
        long diff;
        init = System.currentTimeMillis();
        open();
        try {
            em.getTransaction().begin();
            em.createNativeQuery("DELETE FROM Cliente").executeUpdate();
            em.createNativeQuery("ALTER SEQUENCE GEN_CLIENTE RESTART WITH 0").executeUpdate();
        } catch (Exception e) {
            System.out.println("Deu erro!" + e);
            em.getTransaction().rollback(); // desfaz transacao se ocorrer erro ao persitir
        } finally {
            if (em.getTransaction().isActive()) {
                em.getTransaction().commit();
            }
            close();
            end = System.currentTimeMillis();
            diff = end - init;
            System.out.println("Tempo de resposta = " + (diff / 1000.0) + " segundos em JPA - Hibernate");

        }
    }
Criado 13 de outubro de 2012
Ultima resposta 15 de out. de 2012
Respostas 5
Participantes 3