【问题标题】:var is the collection, not the itemvar 是集合,而不是项目
【发布时间】:2012-10-28 12:36:58
【问题描述】:

我正在循环访问“RSVP”对象的集合,并像这样打印出每个人的“名称”属性的值

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

但我收到错误:“org.hibernate.collection.internal.PersistentSet”类没有“名称”属性

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

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

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

实际上我也有点怀疑它是否是 PersistentSet,我原以为现在它会被转换回普通的“Java”集,但也许不会。

谢谢

【问题讨论】:

  • 你的PersistentSet 有getter 'getName()' 吗?因为这就是 jsf 正在寻找的东西
  • 是的,我的 Event 类有一个 getRsvps() 它返回一个 Set 并且 Rsvp 类有一个 getName() 方法。这一切都在工作,直到(我认为)我改变了我的加载策略,但我不明白是什么导致它突然出错
  • 它在 eventController 中是一个 faces ManagedBean(而不是 CDI),因为我需要 ViewScoped,不确定这是否相关。
  • 尝试用一个列表包装你的集合(让getRsvps()返回一个列表),看看它是否有效......
  • 干杯丹尼尔,你也是对的,它实际上曾经是一个列表,这就是它曾经工作的原因...... doh!

标签: hibernate primefaces


【解决方案1】:

您不能迭代 Set,这是目前 JSF 的限制。 JSF 2.2 就能做到。

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

另请参阅 BalusC 的 this answer


至于 Hibernate 返回 PersistentSet 的事实,这就是它的工作方式。 Hibernate 有自己的Set 实现,因此它可以实现延迟加载等功能。

【讨论】:

  • 非常感谢,特别是关于(当前)JSF 限制的见解。现在工作正常。我进行了一些重构,将其从 List 更改为 Set 以尝试解决另一个问题,这就是造成这种情况的原因。
  • @RinaldoPJr 是否可以使用 Omnifaces #{of:setToList} 创建可编辑的数据表。我徒劳地尝试了这个。需要澄清。我应该将此作为一个单独的问题提出吗?
  • @johny 我不这么认为,但 BalusC 可以更准确地回答你。也许你应该作为一个新问题发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 2018-10-26
  • 1970-01-01
相关资源
最近更新 更多