Jsf Primefaces:向datatable添加新行时出现错误:启用选择时,DataModel必须实现org.Primefaces.model.SelectableDataModel

Jsf Primefaces:向datatable添加新行时出现错误:启用选择时,DataModel必须实现org.Primefaces.model.SelectableDataModel,jsf,datatable,primefaces,Jsf,Datatable,Primefaces,我有一个数据表,我想在其中添加一个新行。这样做时,我得到以下错误 javax.servlet.ServletException:启用选择时,数据模型必须实现org.primefaces.model.SelectableDataModel 我怎样才能解决我的问题 这在我的xhtml中 <h:commandLink action="#{workOrderDetail.addOrderItem}" > <img src="${path.staticRootUrl}i

我有一个数据表,我想在其中添加一个新行。这样做时,我得到以下错误 javax.servlet.ServletException:启用选择时,数据模型必须实现org.primefaces.model.SelectableDataModel

我怎样才能解决我的问题

这在我的xhtml中

<h:commandLink  action="#{workOrderDetail.addOrderItem}" >
        <img src="${path.staticRootUrl}images/add.png" border="0" alt="${msg.workorderdetail_neworderitem}" title="${msg.workorderdetail_neworderitem}"/>
     </h:commandLink>
<p:dataTable styleClass="ptable100" id="orderItems" var="orderItem" value="#{workOrderDetail.orderItems}" width="100%" height="200" widgetVar="results"
     emptyMessage="#{msg.all_lists_no_records_found}" selection="#{workOrderDetail.selectedOrderItem}" selectionMode="single" onRowSelectUpdate=":detail:sub"
     rowKey="#{orderItem.id}"
<p:ajax event="rowSelect"  update=":detail:sub" />


好的,找到问题了。添加新项时,其ID默认为null,并用作行键。因此,在添加新的id时,我将id初始化为-1,它可以工作。

无需将id设置为-1,只需编写如下函数:

public int getRowKey(整数id){
返回id!=null?id:-1;
}


从@rowKey

中的el表达式调用它,哪个PF版本?将
rowKey
属性设置为指向
var
对象的唯一标识符应该可以解决这个问题,但您已经设置了它。PrimeFaces 3.2。我知道,我必须添加它,因为一开始行选择不起作用。但现在效果很好。在页面上的单独部分中显示每行的详细信息。但添加新行时失败。奇怪。好的,发现问题了。添加新项时,其ID默认为null,并用作行键。因此,我在添加一个新的id时将id初始化为-1,它可以正常工作。请注意:我使用了这个解决方案(它本身并不坏),几个月后,我注意到如果与JPA实体一起使用(太天真),它可能会导致问题。如果一个实体已经分配了一个id(比如-1),它可能会搞砸显式持久化或级联持久化。我最终得到了一个实体类,实际上只得到了一个持久化实例(因此它看起来像JSF层中“实体”之间的串扰),并且我得到了一些JPA错误,因为它认为已经有一个实体具有-1。快速的解决方案是检查-1,然后在持久化之前强制它
null
。使用exposed
hashCode()
对我来说很有效(尽管不确定是否有安全后果;我仍然在使用hashCode生成实用程序)。另见
List<IMWSOrderItem> orderList = null;
public void addOrderItem() throws MWSException {
  IMWSOrderItem newOrderItem = getWorkOrder().getMWSOrder().getMWSOrderItem_Set().getNewMWSOrderItem();      
  getWorkOrder().getMWSOrder().getMWSOrderItem_Set().addMWSOrderItem(newOrderItem);
  orderList = null;   
}
public List<IMWSOrderItem> getOrderItems() throws MWSException {
  if (orderList == null) {
     orderList = new ArrayList(Arrays.asList(getWorkOrder().getMWSOrder().getMWSOrderItem_Set().getMWSOrderItems()));
  }
  return orderList;
}
public IMWSOrderItem getSelectedOrderItem() {
  return selectedOrderItem;
}
public void setSelectedOrderItem(IMWSOrderItem newSelectedOrderItem) {
  this.selectedOrderItem = newSelectedOrderItem;
}