Java JSF-使用Primefaces RowEditEvent时如何获得新旧值?

Java JSF-使用Primefaces RowEditEvent时如何获得新旧值?,java,jsf,jsf-2,primefaces,Java,Jsf,Jsf 2,Primefaces,我有一个包含两列(名称和描述)的datatable,当有人更新一行并单击触发execBacking.update方法的复选标记时,我想更新我的数据库 在这个方法中,我通过强制转换event.getObject()来获得新值,但是如何也获得旧值呢?名称是我的主键,因此我需要旧值来知道要在数据库中更新哪一行 xhtml页面 我建议不要将name作为主键,而是添加一个自动递增的id字段,并将该字段设置为主键,不要让用户对该字段进行编辑。这保证您始终可以访问要更新的记录 一般来说,试图以您尝试的方式修

我有一个包含两列(名称和描述)的datatable,当有人更新一行并单击触发
execBacking.update
方法的复选标记时,我想更新我的数据库

在这个方法中,我通过强制转换
event.getObject()
来获得新值,但是如何也获得旧值呢?名称是我的主键,因此我需要旧值来知道要在数据库中更新哪一行

xhtml页面

我建议不要将
name
作为主键,而是添加一个自动递增的
id
字段,并将该字段设置为主键,不要让用户对该字段进行编辑。这保证您始终可以访问要更新的记录


一般来说,试图以您尝试的方式修改数据库中的主键是不好的做法。

您可以在您感兴趣的组件上注册
ValueChangeListener

<p:column headerText="Description">
   <p:cellEditor>
      <f:facet name="output">
          <h:outputText value="#{exec.name}" />
      </f:facet>
      <f:facet name="input">
        <h:inputText value="#{exec.name}">
           <f:valueChangeListener binding="#{keyChangedListener}"/>
           <f:ajax/>
        </h:inputText>
      </f:facet>
   </p:cellEditor>
</p:column>

按照JSF规范的建议,我在这里使用
@ViewScoped
,以避免不必要的副作用。

无法更改数据库。我正在重写一个有15年历史的perl应用程序,主键是名称。我知道这不是最好的做法,但这是我必须要做的。好吧。。。然后,计划B是简单地将旧的
名称
存储在第二个变量中,并以这种方式处理。理想情况下,我想我希望以某种方式通过f:attribute或f:param或类似的方式传递原始值,而不是将重复的“name”添加到我的Exec对象中。最终结果是您必须在某个地方复制它。如果是我,我会在对象中添加一个“originalName”字段。我能给你的最好建议。它可以是一个临时值您是否有兴趣将整行的旧值作为单个对象或单个列获取?两者都可以。我所需要的只是
name
的原始值,因为它是PK。但是如果我使用valueChangeListener,它将无法与
一起工作,是吗?@Catfish-我不能确定,但我想不出不这样做的原因
public void update(RowEditEvent event) {

        Dao dao = new Dao(ds);
        Exec exec = (Exec) event.getObject();
        System.out.println("name = "+exec.getName());  //New name
        System.out.println("desc = "+exec.getDescription());  //New desc
        try {
            // If the new exec was updated successfully
            if(dao.updateExec(accessBacking.getUsername(), null, exec.getName(), exec.getDescription())) {
                FacesContext.getCurrentInstance().addMessage("growl", new FacesMessage(FacesMessage.SEVERITY_INFO, "Success", "Exec Updated Successfully!"));
            } else {
                FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Error Updating Exec!"));
            }
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
    }
<p:column headerText="Description">
   <p:cellEditor>
      <f:facet name="output">
          <h:outputText value="#{exec.name}" />
      </f:facet>
      <f:facet name="input">
        <h:inputText value="#{exec.name}">
           <f:valueChangeListener binding="#{keyChangedListener}"/>
           <f:ajax/>
        </h:inputText>
      </f:facet>
   </p:cellEditor>
</p:column>
@ManagedBean(name="keyChangedListener")
@ViewScoped
public class KeyChangeListener implements ValueChangeListener{

     public void processValueChange(ValueChangeEvent event) throws AbortProcessingException{
          Object oldValue = event.getOldValue(); //get the old value
          Object newValue = event.getNewValue(); //get the new value

      }