2013-10-15 5 views
6

मेरे पास 2 कॉलम (नाम और विवरण) के साथ एक डाटाटेबल है और जब कोई व्यक्ति एक पंक्ति अपडेट करता है और execBacking.update विधि को ट्रिगर करता है तो मैं अपने डेटाबेस को अपडेट करना चाहता हूं।जेएसएफ - प्राइमफेसेस RowEditEvent का उपयोग करते समय पुराने और नए मूल्य कैसे प्राप्त करें?

इस विधि में, मुझे event.getObject() कास्टिंग करके नए मान मिलते हैं, लेकिन मैं पुराने मान भी कैसे प्राप्त कर सकता हूं? नाम मेरी प्राथमिक कुंजी है इसलिए मुझे यह जानने के लिए पुराने मूल्य की आवश्यकता है कि डीबी में कौन सी पंक्ति अपडेट हो।

एक्सएचटीएमएल पेज

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

क्या आप पूरी पंक्ति का पुराना मान एक ऑब्जेक्ट या व्यक्तिगत कॉलम के रूप में प्राप्त करने में रुचि रखते हैं? – kolossus

+0

या तो काम करेगा। मुझे केवल 'नाम' का मूल मूल्य चाहिए क्योंकि यह पीके है। – Catfish

उत्तर

4

मैं सिफारिश करेंगे नहींname अपने प्राथमिक कुंजी हो रही है, लेकिन इसके बजाय एक स्वत: incrementing id क्षेत्र जोड़ सकते हैं और है कि अपनी प्राथमिक कुंजी, और उस क्षेत्र को उपयोगकर्ता द्वारा संपादन योग्य बनाते हैं। यह गारंटी देता है कि आपके पास हमेशा उस रिकॉर्ड तक पहुंच है जिसे आप अपडेट करना चाहते हैं।

आम तौर पर डेटाबेस में प्राथमिक कुंजी को संशोधित करने का प्रयास करने के लिए यह खराब अभ्यास है जिस तरह से आप इसे करने का प्रयास कर रहे हैं।

+1

डेटाबेस को बदल नहीं सकता है। एक 15 साल पुराना पर्ल ऐप है जिसे मैं पुनः लिख रहा हूं और प्राथमिक कुंजी नाम है। मुझे पता है कि यह सबसे अच्छा अभ्यास नहीं है, लेकिन मुझे यह काम करना है। – Catfish

+0

ठीक है ... योजना बी तो बस दूसरे चर में पुराने 'नाम' को स्टोर करना होगा और इसे – StormeHawke

+0

पर संभालना होगा आदर्श रूप से मुझे लगता है कि मैं किसी भी तरह से मूल मूल्य को f: विशेषता या f: param के माध्यम से पास करना चाहता हूं या मेरे Exec ऑब्जेक्ट में डुप्लिकेट "नाम" जोड़ने के बजाय ऐसा कुछ। – Catfish

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> 

keyChangeListenerValueChangeListener के एक कार्यान्वयन के अनुरूप होगा और हम यहाँ <f:ajax/> उपयोग कर रहे हैं यह सुनिश्चित करें कि valueChanged घटना पर निकाल दिया जाता है टेक्स्टबॉक्स अन्यथा श्रोता को अधिसूचित नहीं किया जाएगा। मैं @ViewScoped यहाँ उपयोग कर रहा हूँ के रूप में JSF युक्ति ने सलाह दी, अवांछित दुष्प्रभावों से बचने के लिए

@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 

     } 

: अपने श्रोता की तरह कुछ दिखना चाहिए।

+0

हो सकता है लेकिन यदि मैं एक मूल्यChangeListener का उपयोग करता हूं, तो यह ' के साथ काम नहीं करेगा? – Catfish

+0

@ कैटफ़िश - मैं निश्चित रूप से नहीं कह सकता, लेकिन मैं इसके लिए एक कारण नहीं सोच सकता – kolossus

संबंधित मुद्दे