7

execBacking.update2 つの列 (名前と説明) を持つデータテーブルがあり、ユーザーが行を更新し、メソッドをトリガーするチェックマークをクリックしたときにデータベースを更新したいと考えています。

このメソッドでは、キャストして新しい値を取得しますevent.getObject()が、古い値も取得するにはどうすればよいですか? 名前は私の主キーなので、データベースで更新する行を知るために古い値が必要です。

xhtml ページ

  <p:ajax event="rowEdit" listener="#{execBacking.update}" update=":execForm:execMessages" /> 

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

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

  <p:column headerText="Actions">
    <p:rowEditor />
    <p:commandLink styleClass="ui-icon ui-icon-trash" type="submit" actionListener="#{execBacking.delete}" update=":execForm:execMessages" >
            <f:attribute name="execName" value="#{exec.name}" />
        </p:commandLink>
  </p:column>
</p:dataTable>

バッキングビーン

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()));
        }
    }
4

2 に答える 2

4

主キーにしないことをお勧めしnameますが、代わりに自動インクリメントidフィールドを追加してそれを主キーにし、そのフィールドをユーザーが編集できるようにしないでください。これにより、更新するレコードに常にアクセスできることが保証されます。

一般的に言えば、データベースの主キーを変更しようとするのは悪い習慣です。

于 2013-10-15T21:24:16.690 に答える
0

使用したいコンポーネントに を登録でき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>

keyChangeListenerの実装に対応し、ここでValueChangeListener使用して、イベントがテキストボックスで<f:ajax/>確実に発生するようにします。valueChangedそうしないと、リスナーに通知されません。リスナーは次のようになります。

@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

      }

@ViewScoped望ましくない副作用を避けるために、JSF仕様のアドバイスに従ってhereを使用しています。

于 2013-10-21T18:00:29.127 に答える