Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Não consigo remover a entidade

Tenho uma p:dataTable com diversos atributos da entidade PROJETO, e ao lado uma coluna com um botão para remover a entidade da linha. Meu método de remover não está funcionando, por mais que seja idêntico a outro bean que opera normalmente...

Configuração da p:dataTable:

<p:dataTable value="#{projetoBean.projetos}" var="projeto"
                id="tabelaProjetos" paginator="true" rows="10">

Botão na mesma p:dataTable:

                <p:column headerText="Remover" style="width: 48px;">
                    <div align="center">
                        <p:commandButton icon="fa fa-fw fa-remove"
                            actionListener="#{projetoBean.remover(projeto)}"
                            update="formTabelaProjetos" />
                    </div>
                </p:column>

Método remover do ProjetoBean:

    public void remover(Projeto projeto) {
        System.out.println("Removendo projeto");

        projeto.remove(projeto.getEmpresa()); //Retira o projeto da lista de projetos da EMPRESA
        new DAO<Projeto>(Projeto.class).remove(projeto); //Remove do banco

        DAO<Projeto> dao = new DAO<Projeto>(Projeto.class); //Refaz a lista de projetos
        this.projetos = dao.listaTodos(); //Refaz a lista de projetos
    }

Método Remover da DAO genérica:

    public void remove(T t) {
        EntityManager em = new JPAUtil().getEntityManager();
        em.getTransaction().begin();

        em.remove(em.merge(t));

        em.getTransaction().commit();
        em.close();
    }
3 respostas

ele chega no método? se chega, a operação é refletida no banco? ele apenas não remove do bean em si? Já verificou se o objeto está chegando como deveria?

Ele não chega a retirar do banco. Apesar de concluir toda a chamada do método. Testei dessa forma:

    public void remover(Projeto projeto) {
        System.out.println("Removendo projeto");

        projeto.remove(projeto.getEmpresa()); //Retira o projeto da lista de projetos da EMPRESA
        new DAO<Projeto>(Projeto.class).remove(projeto); //Remove do banco

        DAO<Projeto> dao = new DAO<Projeto>(Projeto.class); //Refaz a lista de projetos
        this.projetos = dao.listaTodos(); //Refaz a lista de projetos

        System.out.println("Projeto removido!");
    }

E vi que a última linha "Projeto removido!" também é impressa. O estranho é que a saída no console finaliza assim:

FASE: RESTORE_VIEW 1
/projeto.xhtml
FASE: APPLY_REQUEST_VALUES 2
FASE: PROCESS_VALIDATIONS 3
FASE: UPDATE_MODEL_VALUES 4
FASE: INVOKE_APPLICATION 5
Removendo projeto
Projeto removido!
FASE: RENDER_RESPONSE 6

Então adicionei uma linha no método remover da minha DAO genérica para verificar se estava realmente chegando lá:

    public void remove(T t) {
        EntityManager em = new JPAUtil().getEntityManager();
        em.getTransaction().begin();

        if(t.getClass().equals(Projeto.class)){
            System.out.println("Entrou no método de remover da DAO");
        }
        em.remove(em.merge(t));

        em.getTransaction().commit();
        em.close();
    }

E por incrível que pareça:

/projeto.xhtml
FASE: APPLY_REQUEST_VALUES 2
FASE: PROCESS_VALIDATIONS 3
FASE: UPDATE_MODEL_VALUES 4
FASE: INVOKE_APPLICATION 5
Removendo projeto
Entrou no método de remover da DAO
Projeto removido!
FASE: RENDER_RESPONSE 6
solução!

Finalmente consegui resolver!

Meu problema estava no mapeamento da classe Empresa, que estava da seguinte forma:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "empresa", fetch = FetchType.EAGER)
private List<Projeto> projetos = new ArrayList<Projeto>();

Com a seguinte alteração nas anotações, pude então deletar um projeto de uma Empresa, e caso delete uma Empresa, todos os projetos são deletados:

@OneToMany(orphanRemoval=true, mappedBy = "empresa", fetch = FetchType.EAGER)
private List<Projeto> projetos = new ArrayList<Projeto>();

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software