2011-10-09 71 views
4

我已閱讀there,但我無法從primefaces數據表單編輯器中編輯值,它給了我未經編輯的值。我正在使用jpa。 XHTML頁面:PrimeFaces 3.0.M3單元格編輯器不更新值

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE html> 
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"      
        xmlns:ui="http://java.sun.com/jsf/facelets" 
        xmlns:h="http://java.sun.com/jsf/html" 
        xmlns:f="http://java.sun.com/jsf/core" 
        xmlns:p="http://primefaces.prime.com.tr/ui" 
        template="/templates/masterLayout.xhtml"> 
     <ui:define name="windowTitle"> 
      learn 
     </ui:define> 
     <ui:define name="content"> 
      <h:form> 
       <p:dataTable value="#{lesson.lessonValue}" var="l" style="width: 400px"> 
        <p:ajax event="rowEdit" listener="#{lesson.onEditRow}"/> 
        <p:column headerText="Lessons" style="width: 300px"> 
         <p:cellEditor> 
          <f:facet name="output"> 
           <h:outputText value="#{l.lessonName}"/> 
          </f:facet> 
          <f:facet name="input"> 
           <p:inputText value="#{l.lessonName}" style="width: 100%"/> 
          </f:facet> 
         </p:cellEditor> 
        </p:column> 
        <p:column headerText="Options"> 
         <p:rowEditor /> 
        </p:column> 
       </p:dataTable> 
      </h:form> 
     </ui:define> 
    </ui:composition> 

lesson.java:

public class lesson implements Serializable { 
    private String name; 
    protected EntityLesson[] lessonList; 

    public String getName() { return name; } 
    public void setName(String newValue) { name = newValue; } 

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("DefaultPU"); 
     public EntityLesson[] getLessonValue() { 
     EntityManager em = emf.createEntityManager(); 
     List<EntityLesson> result; 
     try { 
      EntityTransaction entr = em.getTransaction(); 
      boolean committed = false; 
      entr.begin(); 
      try { 
       Query query = em.createQuery("SELECT l FROM EntityLesson l"); 
       result = query.getResultList(); 
       entr.commit(); 
       committed = true; 
       lessonList = new EntityLesson[result.size()]; 
       lessonList = result.toArray(lessonList); 
      } finally { 
       if (!committed) entr.rollback(); 
      } 
     } finally { 
      em.close(); 
     } 
     return lessonList; 
    } 
    public void onEditRow(RowEditEvent event) { 
     EntityLesson editedLesson = (EntityLesson)event.getObject();//gives me unedited value 
     ............................ 
     ............................ 
    } 

EntityLesson.java:

@Entity 
@Table(name="lessonaaa") 

public class EntityLesson implements Serializable { 
    @Id 
    @Column(name="Lesson_Id", nullable=false) 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    private int lessonId; 

    @Column(name="Lessson", nullable=false, length=65) 
    private String lessonName; 

    public int getLessonId() { return lessonId; } 
    public void setLessonId(int lessonId) { this.lessonId = lessonId; } 

    public String getLessonName() { return lessonName; } 
    public void setLesson (String lessonName) { this.lessonName = lessonName; } 
    } 
+0

您不應該在getter中執行業務邏輯:http://stackoverflow.com/questions/2090033/why-jsf-calls-getters-multiple-times/2090062#2090062每當JSF調用數據表值的getter時需要渲染或處理**每一行**。 – BalusC

回答

8

問題:

當你的數據表上顯示其執行JPQL檢索的教訓名單。之後,他們顯示。 現在您在實體上編輯並點擊保存,列表中已編輯的實體現在具有新值。 但接下來會發生什麼,是再次提取列表,然後使用新提取的enitiy執行偵聽器方法。

如果您將視圖bean中的實體列表存儲在本地屬性中,並將其填充到post構造方法中(由@PostContruct註釋),並且必須製作視圖bean @SessionScoped,則可以解決該問題。然後使用該列表作爲數據表。

0

我幾乎一模一樣的代碼只是不使用的<p:ajax>標籤我代替使用dataTable的rowEditListener屬性。試試這個:

<p:dataTable ... rowEditListener="#{lesson.onEditRow}" ... > 
    ... 
+0

rowEditListener參數在primefaces 3.x上不起作用(請參閱http://cagataycivici.wordpress.com/2011/05/13/ajax-events-as-behaviors/),但我在之前的primefaces 2.2.1上嘗試過,但我無法達到更新的值 – Deniz

1

我的問題是相似的:

的「dataTable的」包含的「價值」的實體列表:

<p:dataTable id="category" var="category" value="#{categoriesBacking.categoriesListEdit}"> 

如果我選擇一個進行編輯,對象傳遞給事件的事件包含以前未修改的值。我發現這是由於dataTable的值是一個列表。作爲一種解決方法(爲了能夠使用組件),我爲任何'列'添加了'filterBy'。如果dataTable將只包含一個值,則該值將被託管bean中傳遞的事件正確解釋。

!!!事件的對象將是修改的實例。

我還使用:

<p:ajax event="rowEdit" update="@this" listener="#{categoriesBacking.onEditRow}" /> 

,而不是DataTable的 'rowEditListener'。

同樣,這只是一個解決方法。是因爲JSF生命週期的

0

這類問題通常與您的支持bean有關。您的「課程」類需要@ManagedBean(javax.faces.bean.ManagedBean)註釋。只需添加

@ManagedBean(name = 「YourBeanName」)

@ViewScoped

之前在課程public class lesson implements Serializable {線。java

相關問題