我在MySQL数据库中有三个表
- sub_category 产品
这些表之间的关系是直观的——按它们出现的顺序一对多。
我从MySQL数据库中得到一个List<SubCategory>
,其中每个子类别都有一个java.util.Set<Product>
,这很明显。
我在<p:dataGrid>
中迭代List<SubCategory>
,如下所示。
<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}
。因此,使用EL(如#{prodRow.prodId}
)访问<h:outputText>
所见的任何产品都会抛出一个异常,如
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
的属性(如#{prodRow.prodId}
)时会抛出异常?
如何解决这个问题?
这里已经解释得很清楚了,但在这种特殊情况下,我无法解决同样的问题。
我正在使用EclipseLink 2.3.2提供的JPA
我曾尝试将java.util.Set
更改为java.util.List
,但这样做需要对应用程序进行太多更改,这是一种痛苦。
相反,我使用它的toArray()
方法把java.util.Set
变成了一个数组,它工作了。
<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>
我已经用<p:graphicImage>
代替了<h:outputText>
,以满足在<p:graphicImage>
上显示图像的具体要求。
我不知道问题是否与JPA提供程序EclipseLink本身或java.util.Set
有关。如果有人知道,请说明。
编辑:
我现在已经改变了每一个逆(或映射)字段从java.util.Set
到java.util.List
在我的应用程序无处不在,它工作得很好。没有必要使用.toArray()
,因为必须使用java.util.Set
。