我在一个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;
}
}
答案 0 :(得分:9)
尝试使用List
。 value属性必须是here所述的以下之一:
答案 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。