2012-10-28 39 views
2

我循环通过“RSVP”对象的集合,并打印出每个人的“名称”属性的值,这样VAR是收藏,而不是项目

<p:dataTable id="rsvpDataTable" var="rsvp" value="#{eventController.event.rsvps}"... 
    <h:outputText value="#{rsvp.name}" /> 
</p:dataTable> 

但我得到的错误: 'org.hibernate.collection.internal.PersistentSet'类没有属性'name'

如果相反,我打印出'rsvp.class.name'来查看它是什么类型,它确实是一个PersistentSet 。

但是为什么?它应该是集合中的单个RSVP实例。

如果我调试代码并停在getRsvps(),我可以看到它返回一个包含我的RSVP对象的PersistentSet。 RSVP具有返回事件的双向关系。这会造成这种情况吗?

我有点怀疑它实际上是一个PersistentSet,我原以为它会被转换回现在设置的普通'Java',但也许不会。

感谢

+0

你的'PersistentSet'有一个getter'getName()'吗?因为这是什么jsf正在寻找 – Daniel

+0

是的,我的事件类有一个getRsvps()返回一个设置和Rsvp类有一个getName()方法。这是所有的工作,直到(我认为)我改变了我的加载策略,但我不明白是什么会导致它突然出错 – Richard

+0

它在一个eventController是一个面临ManagedBean(而不是CDI),因为我需要ViewScoped ,不确定这是否相关。 – Richard

回答

8

你不能迭代一个Set,这是一个JSF限制现在。 JSF 2.2将能够做到这一点。

这就是说,你可以自己转换它,或者我会做什么,你可以使用OmniFaces #{of:setToList} EL function。你不必重新发明轮子。 :)

另请参见由BalusC的this answer


至于事实休眠返回一个PersistentSet,这只是它的工作方式。 Hibernate有自己的实现Set,所以它可以实现懒惰加载等功能。

+0

非常感谢,特别是关于(当前)JSF限制的见解。现在工作正常。我疯狂地进行了一些重构,将其从List改为Set以尝试解决另一个问题,这就是造成这种情况的原因。 – Richard

+0

@理查不客气。 :) – RinaldoPJr

+0

@RinaldoPJr是否可以使用Omnifaces#{of:setToList}创建可编辑的数据表。我徒劳地尝试了这一点。需要澄清。我应该问这是一个单独的问题吗? – 757071

相关问题