我已阅读there,但我不能从primefaces datatable cellEditor获取编辑值,它给了我未编辑的值。我正在使用jpa。 xhtml页面:
<?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 :(得分:8)
由于JSF生命周期而出现问题:
当您显示dataTable时,它会执行JPQL以检索课程列表。之后显示它们。 现在您在实体上编辑并点击保存,列表中已编辑的实体现在具有新值。 但接下来发生的事情是,该列表是另一次获取的,然后使用新获取的enitiy执行侦听器方法。
如果将实体列表存储在视图bean的本地属性中并将其填入post构造方法(由@PostContruct
注释),则可以解决问题,并且必须创建视图bean {{ 1}}。然后将此列表用于数据表。
答案 1 :(得分:1)
我的问题很相似:
&#39; dataTable&#39;包含&#39;值&#39;实体列表:
<p:dataTable id="category" var="category" value="#{categoriesBacking.categoriesListEdit}">
如果我选择一个进行编辑,则传递给事件的对象包含先前未修改的值。我发现这是因为dataTable的值是一个列表。作为一种解决方法(能够使用该组件),我添加了一个&#39; filterBy&#39;到任何一列&#39;。如果dataTable只包含一个值,那么托管bean中传递的事件将正确解释该值。
!!!事件的对象将是修改后的实例。
我也用:
<p:ajax event="rowEdit" update="@this" listener="#{categoriesBacking.onEditRow}" />
而不是dataTable&#39; rowEditListener&#39;。
同样,这只是一种解决方法。
答案 2 :(得分:0)
我有几乎完全相同的代码,除了使用<p:ajax>
标记而不是使用dataTable的rowEditListener
属性。试试这个:
<p:dataTable ... rowEditListener="#{lesson.onEditRow}" ... >
...
答案 3 :(得分:0)
这类问题通常与您的支持bean有关。您的“课程”类需要@ManagedBean(javax.faces.bean.ManagedBean)注释。只需添加
@ManagedBean(name =“YourBeanName”)
@ViewScoped
在您的lesson.java中的public class lesson implements Serializable {
行之前