Jsf 如果在刷新视图之前添加了条目,则Primefaces datatable OneEdit()会编辑错误的条目

Jsf 如果在刷新视图之前添加了条目,则Primefaces datatable OneEdit()会编辑错误的条目,jsf,jsf-2,primefaces,datatable,Jsf,Jsf 2,Primefaces,Datatable,我有一个关于Primefaces(5.0版)及其数据表的问题。 如果我有一个p:datatable,并且我想要编辑一个单元格或行(没关系,在这种情况下行为是相同的),并且有人向该数据库添加了一个新条目,那么我编辑新条目而不是旧条目 嗯。以下是一些代码片段: my index.xhtml: <h:form id="viewChanges"> <p:dataTable id="changeTable" widgetVar="changeTable"

我有一个关于Primefaces(5.0版)及其数据表的问题。 如果我有一个p:datatable,并且我想要编辑一个单元格或行(没关系,在这种情况下行为是相同的),并且有人向该数据库添加了一个新条目,那么我编辑新条目而不是旧条目

嗯。以下是一些代码片段:

my index.xhtml:

<h:form id="viewChanges">
  <p:dataTable id="changeTable" 
             widgetVar="changeTable"
             value="#{changeController.list}" var="item"
             selection="#{changeController.selectedChangeEntry}"
             selectionMode="single" rowKey="#{item.id}"
             sortBy="#{item.id}" sortOrder="descending"
             editable="#{lDAPUserController.loggedIn}" 
             style="width: auto">

                <p:ajax event="rowEdit" 
                        listener="#{changeController.onRowEdit}" 
                        update=":growlInfo, :growlError, :viewChanges:changeTable" />

                         ..output of columns..

                <p:column style="width:32px">
                    <p:rowEditor />
                </p:column>
  </p:dataTable>
</h:form>
有了这个,就可以复制错误了。 小示例:我们有一个包含3个条目的数据集。-id=1,2,3

我们打开一个浏览器[1],看到3个数据集。我们现在打开一个私有选项卡[2],然后转到同一站点并添加一个新条目。在不刷新[1]的情况下,我们编辑id为3的条目。我们突然编辑了id=4的条目


有人能解释一下为什么会这样吗?是我还是脸上的虫子?范围错误?

我还没有看到使用不同的选项卡、窗口或甚至不同的浏览器(从而使用不同的会话)会发生这种情况。我无法使用不同的浏览器(以某种方式)复制它-只有在我使用两个完全不同的客户端或一个处于私有模式的浏览器时。根据您所描述的,缺陷必须在
ViewScoped
中:如果PrimeFaces在一个客户机上工作,而不是在另一个客户机上工作,那么两个PrimeFaces之间没有交互,因此PF缺陷没有意义。您不太可能在
ViewScoped
中发现bug,只有在用尽所有其他可能性之后才能想象它。我怀疑您的代码中有一个bug,可能是您使用的
rowKey
,它似乎是。它也出现在其他作用域中,并且我的rowKey是数据库中持久化的对象ID。
@ManagedBean(name = "changeController")
@ViewScoped
public class ChangeController implements java.io.Serializable {

    attributes, getter, setter, other methods etc..

    public void onRowEdit(RowEditEvent event) { 
        FacesMessage msg = new FacesMessage("Change Edited", ((Change) event.getObject()).getId());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
}