Редактор ячеек PrimeFaces 3.0.M3 не обновляет значение - PullRequest
4 голосов
/ 10 октября 2011

Я прочитал там , но я не могу взять отредактированное значение из простого объекта cellEditor, это дает мне неотредактированное значение.Я использую JPA.xhtml page:

<?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; }
    }

Ответы [ 4 ]

8 голосов
/ 11 января 2013

Проблема возникает из-за жизненного цикла JSF:

Когда отображается ваш dataTable, он выполняет JPQL для получения списка уроков.После этого они отображаются.Теперь вы редактируете сущность и нажимаете кнопку Сохранить, отредактированная сущность в списке теперь имеет новое значение.Но что происходит дальше, так это то, что список извлекается в другой раз, а затем выполняется метод слушателя с только что извлеченными объектами.

Вы можете решить эту проблему, если сохраните список сущностей в локальном атрибуте впросмотреть bean-компонент и заполнить его методом post-construct (с примечанием @PostContruct), и вы должны сделать bean-компонент вида @SessionScoped.Затем используйте этот список для ввода данных.

1 голос
/ 12 января 2012

Моя проблема похожа:

«dataTable» содержит в качестве «значения» список сущностей:

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

Если я выберу одну для редактирования, объект, который передаетсясобытие содержит ранее неизмененное значение.Я заметил, что это связано с тем, что значение dataTable является списком.В качестве обходного пути (чтобы иметь возможность использовать компонент) я добавил «filterBy» к любому из «столбцов».Если dataTable будет содержать только одно значение, это значение будет правильно интерпретировано переданным событием в управляемом компоненте.

!!!Объект события будет измененным экземпляром.

Я также использую:

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

вместо 'rowEditListener' dataTable.

Опять же, это просто обходной путь.

0 голосов
/ 04 июля 2013

Проблемы такого рода обычно связаны с вашим бобом. Вашему классу "урока" нужна аннотация @ManagedBean (javax.faces.bean.ManagedBean). Просто добавьте

@ ManagedBean (name = "YourBeanName")

@ ViewScoped

перед строкой public class lesson implements Serializable { в вашем уроке. Java

0 голосов
/ 10 октября 2011

У меня почти такой же код, за исключением того, что вместо тега <p:ajax> я использую атрибут rowEditListener dataTable.Попробуйте вместо этого:

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