2012-05-30 28 views
2

我有一個數據表,我要添加一個新行。這樣做時出現以下錯誤 javax.servlet.ServletException:啓用選擇時,DataModel必須實現org.primefaces.model.SelectableDataModel。Primefaces:向數據表中添加一個新行給出錯誤:當啓用選擇時,DataModel必須實現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" /> 

,這是我的豆代碼

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; 
} 
+0

哪個PF版本?將'rowKey'屬性設置爲指向'var'對象的唯一標識符應該可以解決它,但是您已經設置了它。 – BalusC

+0

PrimeFaces 3.2。我知道,我必須添加它,因爲一開始行選擇不起作用。但現在工作正常。在頁面的單獨部分中顯示每行的詳細信息。但是,添加新行時失敗。奇怪。 – roel

+0

好的,發現問題了。添加新項目時,其ID默認爲空,並且該ID用作rowkey。所以我在添加一個新的ID時將其初始化爲-1,並且它工作正常。 – roel

回答

5

好了,發現了問題。添加新項目時,其ID默認爲空,並且該ID用作rowkey。所以我在添加一個新的ID時將其初始化爲-1,並且它工作正常。

+0

只是一個相關的警告詞:我使用了這個解決方案(它本身不是壞的),然後在幾個月後注意到它可能會導致一個問題,如果與JPA實體一起使用(太天真)。如果一個實體已經分配了一個id(比如-1),那麼它可能會搞亂一個顯式的持久化或級聯持久化。我最終得到了一個實體類實際上只有1個持久實例(因此它看起來像JSF層中的「實體」之間的交叉對話),並且由於它認爲已經有一個實體具有 - 1。快速解決方案是檢查-1,然後在保留之前強制它爲空。 –

+0

使用公開的'hashCode()'適用於我(雖然不確定是否存在安全後果;我仍然使用hashCode生成實用程序)。另見https://stackoverflow.com/questions/18797241/using-rowkey-in-primefaces-datatable-with-new-entity –

相關問題