p:dataTable RowEdit保留旧值

时间:2015-12-03 19:59:34

标签: jsf-2 primefaces datatable edit

我试图更新在数据表上编辑的行的值(editable = true,行版)。但我总是通过听众获得旧的价值。你能告诉我我的错误在哪里吗? TKS ..

以下是代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:p="http://primefaces.org/ui">

<ui:composition template="_template.xhtml">
<ui:define name="conteudo">
    <h:form id="certificacao" >
        <p:messages globalOnly="false" showSummary="true" showDetail="true" /> 
        <p:growl id="messages" autoUpdate = "true"/> 
        <p:fieldset legend="Dados da Certificação">             
            <h:panelGrid columns="3" >
                <p:outputLabel value="Nome da Certificação:" for="nomeCertificacao" style="font-weight:bold"/>
                <p:inputText id="nomeCertificacao" value="#{certificacaoBean.certificacao.nomeCertificacao}" 
                             required="true" requiredMessage="Nome da certificação não preenchido" >   
                </p:inputText>
                <br/>

                <h:outputLabel value="Descrição da Certificação:" for="descCertificacao" style="font-weight:bold"/>
                <p:inputText id="descCertificacao" value="#{certificacaoBean.certificacao.descCertificacao}">
                </p:inputText>
                <br/>

                <p:commandButton value="Gravar" action="#{certificacaoBean.gravar}" icon="fa fa-fw fa-save"  
                        process="@this certificacao" update="@form certificacao" /> 
                <br/>
            </h:panelGrid>
        </p:fieldset>
        <p:dataTable 
        value="#{certificacaoBean.certificacoes}" 
        var="certificacao" 
        id="tabelaCertificacoes"
        emptyMessage="Nenhuma certificação cadastrada" 
        editable="true" 
        style="margin-bottom:0px" 
        filteredValue="#{certificacaoBean.certificacaoSelecionada}"
        widgetVar="tabelaCertificacoes">

            <p:ajax event="rowEdit" listener="#{certificacaoBean.onRowEdit}" update=":certificacao:messages"/>
            <p:ajax event="rowEditCancel" listener="#{certificacaoBean.onRowCancel}" update=":certificacao:messages" />

            <p:column 
            headerText="Certificação" 
            filterBy="#{certificacao.nomeCertificacao}" 
            filterMatchMode="contains">                 
                <p:cellEditor>
                    <f:facet name="output">
                        <div align="center">
                            <h:outputText value="#{certificacao.nomeCertificacao}" />
                        </div>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{certificacao.nomeCertificacao}" style="width:100%" label="Certificação"/>
                    </f:facet>
                </p:cellEditor> 
            </p:column>

            <p:column headerText="Descrição" filterBy="#{certificacao.descCertificacao}" filterMatchMode="contains">
                <p:cellEditor>
                    <f:facet name="output"><h:outputText value="#{certificacao.descCertificacao}" /></f:facet>
                    <f:facet name="input"><p:inputText value="#{certificacao.descCertificacao}" style="width:100%" label="Descrição"/></f:facet>
                </p:cellEditor>
            </p:column>

            <p:column style="width:3px">
                <p:rowEditor />
            </p:column>

            <p:column style="width:3px">
                <f:facet name="header">
                    <h:outputText value="" style="width:3px"/>
                </f:facet>

                <p:commandButton 
                        action="#{certificacaoBean.removeCertificacao(certificacao)}" 
                        icon="ui-icon-close" 
                        title="Remover Certificação" 
                        update="tabelaCertificacoes" 
                        process="@this" >
                    <f:setPropertyActionListener
                    target="#{certificacaoBean.certificacaoSelecionada}"
                    value="#{certificacao}" />
                </p:commandButton>

            </p:column>
        </p:dataTable>

    </h:form> 
</ui:define>

豆类部分:

import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.CellEditEvent;
import org.primefaces.event.RowEditEvent;
import br.com.dao.DAO;
import br.com.model.Certificacao;

@ManagedBean(name="certificacaoBean") 
@ViewScoped
public class CertificacaoBean implements Serializable {

private static final long serialVersionUID = 1L;

private Certificacao certificacao = new Certificacao();

public void setCertificacao(Certificacao certificacao) {
    this.certificacao = certificacao;
}

private Certificacao certificacaoSelecionada;

public Certificacao getCertificacao() {
    return certificacao;
}

public Certificacao getCertificacaoSelecionada() {
    return certificacaoSelecionada;
}

public void setCertificacaoSelecionada(Certificacao certificacaoSelecionada) {
    this.certificacaoSelecionada = certificacaoSelecionada;
}

public void removeCertificacao(Certificacao certificacao) {
     new DAO<Certificacao>(Certificacao.class).remove(certificacaoSelecionada);
     FacesMessage msg = new FacesMessage("Certificação excluída",""); 
     FacesContext.getCurrentInstance().addMessage(null, msg);
}

public List<Certificacao> getCertificacoes() {
    return new DAO<Certificacao>(Certificacao.class).listaTodos();
}

public void gravar() {
    System.out.println("Gravando Certificação " + this.certificacao.getNomeCertificacao());

    if (certificacao.getNomeCertificacao().isEmpty()) {
        FacesContext.getCurrentInstance().addMessage ("nomeCertificacao",
                new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                "O nome da certificação deve ser preenchido.", "O nome da certificação deve ser preenchido."));
        return;
    } 

    new DAO<Certificacao>(Certificacao.class).adiciona(this.certificacao);

    this.certificacao = new Certificacao();

    }

// Inicio Editor na Tabela
public void onRowEdit(RowEditEvent event) {

    System.out.println("Passando no DAO retorno event Cod: " + ((((Certificacao) event.getObject()).getCodigoCertificacao())));
    System.out.println("Passando no DAO retorno event Name: " + ((((Certificacao) event.getObject()).getNomeCertificacao())));
    System.out.println("Passando no DAO retorno object: " + ((((Certificacao) event.getObject()))));
    System.out.println("DAO evento " + event);

    //new DAO<Certificacao>(Certificacao.class).adiciona(this.certificacao);
    //Problema AQUI
    new DAO<Certificacao>(Certificacao.class).atualiza((((Certificacao) event.getObject())));
    this.certificacao = new Certificacao();


    FacesMessage msg = new FacesMessage("Certificação editada", String.valueOf((((Certificacao) event.getObject()).getCodigoCertificacao())));
    FacesContext.getCurrentInstance().addMessage(null, msg);

}

public void onRowCancel(RowEditEvent event) {
    FacesMessage msg = new FacesMessage("Edição cancelada", String.valueOf((((Certificacao) event.getObject()).getCodigoCertificacao())));
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

public void onCellEdit(CellEditEvent event) {
    Object oldValue = event.getOldValue();
    Object newValue = event.getNewValue();

    if(newValue != null && !newValue.equals(oldValue)) {
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
}

}

道:

package br.com.dao;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaQuery;

public class DAO<T> {

private final Class<T> classe;

public DAO(Class<T> classe) {
    this.classe = classe;
}

public void adiciona(T t) {

    // consegue a entity manager
    EntityManager em = new JPAUtil().getEntityManager();

    // abre transacao
    em.getTransaction().begin();

    // persiste o objeto
    em.persist(t);

    // commita a transacao
    em.getTransaction().commit();

    // fecha a entity manager
    em.close();
}

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

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

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

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

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

public List<T> listaTodos() {
    EntityManager em = new JPAUtil().getEntityManager();
    CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
    query.select(query.from(classe));

    List<T> lista = em.createQuery(query).getResultList();

    em.close();
    return lista;
}

public T buscaPorId(Integer id) {
    EntityManager em = new JPAUtil().getEntityManager();
    T instancia = em.find(classe, id);
    em.close();
    return instancia;
}

public int contaTodos() {
    EntityManager em = new JPAUtil().getEntityManager();
    long result = (Long) em.createQuery("select count(n) from certificacao n")
            .getSingleResult();
    em.close();

    return (int) result;
}

public List<T> listaTodosPaginada(int firstResult, int maxResults) {
    EntityManager em = new JPAUtil().getEntityManager();
    CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
    query.select(query.from(classe));

    List<T> lista = em.createQuery(query).setFirstResult(firstResult)
            .setMaxResults(maxResults).getResultList();

    em.close();
    return lista;
}

}

1 个答案:

答案 0 :(得分:0)

在您的代码中,您只更新消息&#39; id而不是数据表的ID。尝试更新&#34;更新&#34;编辑行时ajax的属性。