迭代<p:datagrid>中的java.util.Set。原因,类org.eclipse.persistence.indirection.IndirectSet没有属性xxx </p:datagrid>

时间:2014-03-20 18:27:14

标签: jsf jpa primefaces eclipselink

我在MySQL数据库中有三个表。

  • 类别
  • sub_category
  • 产品

这些表之间的关系是直观的 - 按照它们出现的顺序一对多。


我从MySQL数据库中获得List<SubCategory>,其中每个子类别都有一个java.util.Set<Product>

我在List<SubCategory>中迭代<p:dataGrid>,如下所示。

<p:dataGrid id="dataGrid" rows="4" first="0" columns="1" value="#{productDetailsManagedBean}" var="row" rowIndexVar="rowIndex" paginator="true" paginatorAlwaysVisible="false" pageLinks="10" lazy="true" rowsPerPageTemplate="1,2,3">

        <h:panelGrid columns="1" style="width:100%">
            <h:outputText value="#{row.subCatId}"/>

            <p:carousel id="carousel" value="#{row.productSet}" var="prodRow" numVisible="4" headerText="#{row.subCatName}">
                <h:outputText value="#{prodRow.prodId}"/>
            </p:carousel>

        </h:panelGrid>

</p:dataGrid>

<p:carousel>的value属性不起作用。它只是说,{IndirectSet: not instantiated}。因此,使用#{prodRow.prodId}<h:outputText>等EL访问任何产品都会引发异常,例如,

javax.el.PropertyNotFoundException: The class 'org.eclipse.persistence.indirection.IndirectSet' does not have the property 'prodId'

当我改变时,

<h:outputText value="#{prodRow.prodId}"/>

<h:outputText value="#{row.productSet.size()}"/>

它正确显示row.productSet的大小(它不是空的,大小与List<SubCategory>中每个子类别的行数完全相同。Set正是初始化)。

为什么在访问Product的{​​{1}}属性时会抛出异常?

如何解决这个问题?

这是精确解释的here,但在这种特殊情况下,我无法解决同样的问题。

我正在使用EclipseLink 2.3.2提供的JPA

1 个答案:

答案 0 :(得分:0)

我尝试将java.util.Set更改为java.util.List,但这样做需要对应用程序进行太多更改,这很痛苦。

相反,我已使用java.util.Set方法将toArray()转换为数组并且有效。

<p:carousel id="carousel" value="#{row.productSet.toArray()}" var="prodRow" numVisible="6" headerText="#{row.subCatName}">
    <!--<h:outputText value="#{prodRow.prodId}"/>-->
    <p:graphicImage library="fileUpload" name="product_image/medium/#{prodRow.productImageSet.toArray()[0].prodImage}" alt="#{prodRow.prodName}" height="140" width="135"/>
</p:carousel>

我已将<h:outputText>替换为<p:graphicImage>,以便在<p:graphicImage>上显示图片的具体要求。

我不知道问题是否与JPA提供者EclipseLink本身或java.util.Set有关。如果有人知道,请澄清。


修改

我现在已经将我的应用程序中的每个逆(或映射)字段从java.util.Set更改为java.util.List并且它工作得很好。无需使用.toArray(),因为必须与java.util.Set一起使用。