p:dataList不能迭代java.util.Set

时间:2011-03-11 01:50:00

标签: java hibernate jsf primefaces

我在一个primefaces dataGrid中有一个primefaces dataList,但是我有问题映射到嵌套的dataList集合的属性(java.util.Set)。当我引用嵌套Set(dream.tag)上的任何属性时,我得到异常:

  

javax.servlet.ServletException:/registered/modify.xhtml @ 42,48 value =“#{tag.id}”:在类型org.hibernate.collection.PersistentSet上找不到属性'id'。

该属性存在,但dream.tag属性映射到私有Set标记。是否可以将dataList组件与Set一起使用。我在下面复制了我的数据模型的大纲。谢谢你的帮助!

<p:dataGrid var="dream" value="#{dreamModifyBean.dreams}" columns="5"  rows="10" paginator="true" effect="true"  paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="10,15,20" paginatorPosition="bottom"> 
    <p:column>  
        <h:panelGrid columns="1" style="width:100%"> 
            <h:outputText value="#{dream.order}. #{dream.title}"/><br/>
            <p:graphicImage value="#{dream.imageThumb}" width="125" height="100"/><br/>
            <h:outputText value="#{dream.notes}"/><br/>
            <p:dataList value="#{dream.tag}" var="tag">  
                <h:outputText value="#{tag.id}"/>
            </p:dataList> 
            <h:outputText value="#{bundle['dreamModify.cost.TEXT']} #{dream.cost}"/><br/>
        </h:panelGrid>  
    </p:column>  
</p:dataGrid>

Dream(dreamModifyBean.dreams) - 父:

public class Dream implements Serializable{
 @OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
 @JoinColumn(name="DREAM_ID")
 private Set<Tag> tag;

public Set<Tag> getTag() {
    return tag;
}
public void setTag(Set<Tag> tag) {
    this.tag = tag;
}
}

标签(dream.tag) - 儿童

public class Tag {
 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 @Basic(optional=false)
 @Column(name="ID")
 private Long id;
 @Basic(optional=false)
 @Column(name="DESCRIPTION")
 private String description;
 @ManyToOne(fetch=FetchType.EAGER)
 @JoinColumn(name="DREAM_ID")
 private Dream dream;

 public Long getId() {
    return id;
 }
 public void setId(Long id) {
    this.id = id;
 }
 public String getDescription() {
    return description;
 }
 public void setDescription(String description) {
    this.description = description;
 }
public Dream getDream() {
    return dream;
}
public void setDream(Dream dream) {
    this.dream = dream;
}
}

3 个答案:

答案 0 :(得分:9)

尝试使用List。 value属性必须是here所述的以下之一:

  • 豆类列表
  • 豆类数组
  • 单个豆子
  • 一个javax.faces.model.DataModel对象
  • java.sql.ResultSet对象
  • 一个javax.servlet.jsp.jstl.sql.Result对象
  • 一个javax.sql.RowSet对象

答案 1 :(得分:2)

您可以使用Set:

的toArray()方法
<p:dataList value="#{dream.tag.toArray}" var="tag">  
    <h:outputText value="#{tag.id}" />
</p:dataList>

答案 2 :(得分:1)

我有完全相同的问题,并假设在primefaces实现中有一个错误(它清楚地表明它迭代了集合)。顺便说一句,它似乎在呈现结束标记时失败,而不是列表本身。

A(不完全令人满意)的解决方法是添加辅助方法:

public List<Tag> getTagsAsList() {
    return new ArrayList<Tag>(tags);
}

@Matt Handy:Set can 当然可以订购,有些实现(比如TreeSet),有些则不是(比如HashSet)。 Set和List之间的主要区别在于重复项的处理。

修改: 我太快了,不能责怪Primefaces。似乎问题的根源在于JSF实现本身,它没有为Sets提供DataModel。有关详细信息,请参阅here