Dificuldades ao excluír um registro usando JPA

1 resposta
FabricioPJ

Olá a todos. Estou aprendendo a manipular registros de banco de dados usando JPA. Já consegui inserir registros. Mas agora estou tentando excluír esses mesmos registros, mas não consigo. O erro que dá é o seguinte: "NullPointerException"

Sei que isso sognifica que estou tentando referênciar um objeto que não existe.

Abaixo segue o meu código para inserir e para excluír, que é o metodo defeituoso.

Metodo Inserir

public void insereAtividade(){


        a.setNome_atividade("Funciona 2 vezes...");
        a.setDescricao_atividade("Funciona de novo");

        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        try{

            em.persist(a);
            em.getTransaction().commit();

        }
        catch(Exception e){

            e.printStackTrace();
            em.getTransaction().rollback();

        }

        finally{

            em.close();

        }

    }

Metodo Excluir

public void excluirAtividade(int id){

        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        try{

            if(a.getId_atividade() == id){
                em.remove(em.merge(a));
                em.getTransaction().commit();
                em.close();
            }

        }
        catch(Exception e){
            e.printStackTrace();
            em.getTransaction().rollback();
        }
        finally{
            em.close();
        }

    }

E no método main de minha classe eu chamo esses metodos assim:

public static void main(String args[]){

        //new ManipulaBancoAtividade().insereAtividade();
        new ManipulaBancoAtividade().excluirAtividade(9);

    }

Lembrando que estou usando o banco APache Derby(Java DB).

Agradeço a ajuda de todos.

1 Resposta

Grinvon

Você está com problemas sérios de padrões aí em seus exemplo, vou tentar lhe mostrar algumas formas que é melhor.

Ao invés de usar como parâmetro int id, use a instância da prórpia classe que você deseja excluir

exemplo:

public void excluirAtividade(MinhaEntidade pId) {
...
}

Outra coisa. verifique em seus métodos de operação de escrita, se a conexão, ou melhor… a transação está aberta e então execute a operação desejada, para o seu caso, seria algo do tipo:

if (!lEm.getTransaction().isActive()) {
                lEm.getTransaction().begin();
            }
            if (!lEm.contains(lModel)) {
                lModel = lEm.merge(lModel);
            }
            lEm.remove(lModel);
            lEm.flush();

Onde: lEm é um EntityManager.

Quando você levar isso para algo mais sério, lembre-se que o controle da transação em parte é feito pela camada de negócio e outra pela camada de apresentação, nunca ficando apenas restrito à camada de negócio, pois é a camada de apresentação que saberá o começo e o fim de uma transaction, ou seja, ela que saberá onde deve-se dar o commit.

Criado 18 de fevereiro de 2009
Ultima resposta 18 de fev. de 2009
Respostas 1
Participantes 2