2015-12-03 4 views
1

Я пытаюсь обновить значение строки, отредактированной на datatable (editable = true, row edition). Но я всегда получаю старую ценность через слушателя. Можете ли вы рассказать мне, где моя ошибка? ТКС ..p: dataTable RowEdit сохранение старых значений

Вот код:

<?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; 
} 

} 
+0

[mcve] и ваше название не умное ... «не работает ...»? – Kukeltje

+0

Нет ошибки, это просто не обновляет значение ... Как и listerner, вы не получаете обновленное значение в форме в строке datatable. – Warl

+0

@Warl попробуйте удалить required = "true в inputText и сделать то, что говорит мой ответ, также –

ответ

0

В вашем коде вы обновляете сообщение, а не идентификатор datatable. Попробуйте обновить форму в атрибуте «update» ajax при редактировании строки.

+0

Tks ... Как-то я преодолел эту проблему, но Я наткнулся на другой ... Теперь я могу обновить данные в базе данных, но когда я нажимаю на параметр редактирования, значения исчезают, а строка - с пробелами. Когда я изменяю значение, оно снова отображается и изменяется в базе данных. – Warl

Смежные вопросы