2013-10-15 29 views
6

2 sütun (isim ve açıklama) içeren bir veritabam var ve bir kullanıcı bir satırı güncelleştirdiğinde ve execBacking.update yöntemini tetikleyen onay işaretini tıkladığında veritabanımı güncellemek istiyorum.JSF - Primefaces RowEditEvent kullanırken eski ve yeni değerler nasıl alınır?

Bu yöntemde, event.getObject()'u seçerek yeni değerler alıyorum, ancak eski değerleri nasıl alabilirim? İsim birincil anahtarım, bu yüzden db'de hangi satırın güncelleneceğini bilmek için eski değere ihtiyacım var.

xhtml sayfa

<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> 

Ben değilname birincil anahtar olan tavsiye, ancak bunun yerine otomatik artan id alan eklemek ve yapmak istiyorum

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

Tüm satırın eski değerini tek bir nesne veya tek tek sütun olarak almak ister misiniz? – kolossus

+0

Ya işe yarayacaktı. İhtiyacım olan tek şey PK olduğu için 'isim'in orijinal değeri. – Catfish

cevap

4

Taban fasulye birincil anahtar ve ,'un bu alanı kullanıcı tarafından düzenlenebilir yapmaz. Bu, güncellemek istediğiniz kayda her zaman erişmenizi garanti eder.

Genel olarak, bir veritabanında birincil anahtarı, yapmaya çalıştığınız şekilde değiştirmeyi denemek kötü bir uygulamadır.

<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> 

keyChangeListenerValueChangeListener bir uygulamaya karşılık gelecektir ve biz valueChanged olay ateş emin olmak için burada <f:ajax/> kullanıyorsanız:

+1

Veritabanını değiştiremezsiniz. Yeniden yazdığım 15 yıllık bir Perl uygulaması var ve birincil anahtar isim. En iyi uygulama olmadığını biliyorum, ama çalışmam gereken şey bu. – Catfish

+0

Tamam ... B planı daha sonra eski bir "name" kelimesini ikinci bir değişkende saklamak ve – StormeHawke

+0

bu şekilde ele almak olacaktır. İdeal olarak bir f: attribute veya f: param ile orijinal değeri geçmek isterim. veya exec nesnesine yinelenen bir "isim" eklemek yerine bunun gibi bir şey. – Catfish

0

Sen kullanarak ilgilendiğiniz bileşeni üzerinde bir ValueChangeListener kayıt olabilirsiniz metin kutusu. Aksi halde dinleyici haberdar edilmeyecektir. Ben istenmeyen yan etkilerinden kaçınmak için, MTU Spec tarafından tavsiye olarak burada @ViewScoped kullanıyorum

@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 

     } 

: Sizin dinleyici gibi görünmelidir.

+0

olabilir. Ama eğer bir valueChangeListener kullanırsam, ' 'ile çalışmayacaktır. – Catfish

+0

@Catfish - Elbette söyleyemem ama bunun için bir neden düşünemiyorum. – kolossus