我在MySQL数据库中有三个表。
这些表之间的关系是直观的 - 按照它们出现的顺序一对多。
我从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
答案 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
一起使用。