deleting an object from the database with jpa 2 and jsf 2

2

Well I'm trying to make an exclusion using jpa with jsf but I'm not having success. I have my table.

<p:dataTable value="#{mbProduto.produtos}"
            var="produtos"
            paginator="true"
            rows="10"
            paginatorTemplate="{CurrentPageReport}
            {FirstPageLink}
            {PreviousPageLink} {PageLinks}
            {NextPageLink} {LastPageLink}
            {RowsPerPageDropdown}"
            rowsPerPageTemplate="5,10,15"
            style="width: 80%"
            lazy="true">                
            <p:column>
                    <f:facet name="header">
                        Identificador
                    </f:facet>
                    #{produtos.idProduto}
            </p:column>

            <p:column>
                    <f:facet name="header">
                        Nome
                    </f:facet>
                    #{produtos.nomeProduto}
            </p:column>

            <p:column>
                    <f:facet name="header">
                        Especificações
                    </f:facet>
                    #{produtos.especificacaoProduto}
            </p:column>

            <p:column>
                    <f:facet name="header">
                        Medida Horizontal
                    </f:facet>
                    #{produtos.medidaX}
            </p:column>

            <p:column>
                    <f:facet name="header">
                        Medida Vertical
                    </f:facet>
                    #{produtos.medidaY}
            </p:column>

            <p:column>
                    <f:facet name="header">
                        Preço de Venda
                    </f:facet>
                    #{produtos.precoDeMetroVenda}
            </p:column>

            <p:column>
                    <f:facet name="header">
                        <h:outputText value="Ações" />
                    </f:facet>
                    <h:commandButton value="excluir"
                            action="#{mbProduto.excluir}"
                        id="produtos" ajax="false" onclick="if(!confirm('Deseja excluir #{produtos.nomeProduto}  ?')) return false" />
            </p:column>

            </p:dataTable>

I have my Bean

public String excluir() {
    produtoDao.excluir(produto);
    return "pgproduto";
}

it is as requestScoped

And finally I got it in my DAO

/*** excluir um produto */
public void excluir(Produto produto) {
    EntityManager em = JPAUtil.getEntityManager();
    em.getTransaction().begin();
    em.remove(produto);
    em.getTransaction().commit();
    em.close();     
}

Thanks and if anyone can give a force thankful

    
asked by anonymous 17.07.2014 / 03:22

2 answers

1

After searching and of course with the help of the staff I got a satisfactory answer when the object needs to be managed and I can do it with the merged merge or find and it is also interesting to pass the selected object to the jumbled deletion and did it with the tag <f:setPropertyActionListener value="#{produtos}" target="#{mbProduto.produto}"/> I think it's just that thanks to everyone

    
18.07.2014 / 04:00
0

There is probably an error because the produto object is in the detached state, that is, outside the Entity Manager context.

It's important to know that you can not pass any object to JPA. If that instance is not being managed by it, it is considered a new entity.

The most "secure" in this case is to retrieve the instance of produto from EntityManager and then request removal.

Example:

public void excluir(Produto produto) {
    EntityManager em = JPAUtil.getEntityManager();
    em.getTransaction().begin();

    //recupera a instância do EntityManager
    produto = em.find(Produto.class, produto.getId());

    em.remove(produto);
    em.getTransaction().commit();
    em.close();     
}
    
17.07.2014 / 16:26