p: dataList не может повторять java.util.Set

У меня есть список данных primefaces в dataGrid, но у меня проблема с сопоставлением со свойством вложенной коллекции dataList (java.util.Set). Когда я ссылаюсь на какой-либо атрибут во вложенном наборе (dream.tag), я получаю исключение:

javax.servlet.ServletException: /registered/modify.xhtml @ 42,48 value = "# {tag.id}": свойство 'id' не найдено в типе org.hibernate.collection.PersistentSet.

Этот атрибут есть, но атрибут 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>

Мечта (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;
}
}

person c12    schedule 11.03.2011    source источник


Ответы (3)



Вы можете использовать метод toArray () класса Set:

<p:dataList value="#{dream.tag.toArray}" var="tag">  
    <h:outputText value="#{tag.id}" />
</p:dataList>
person Ahmet    schedule 16.04.2014

У меня точно такая же проблема, и я предполагаю, что это ошибка в реализации primefaces (в ней четко указано, что она выполняет итерацию по коллекциям). Кстати, похоже, что он терпит неудачу, пока он отображает конечный тег, а не сам список.

Обходной путь (не полностью удовлетворительный) - добавить вспомогательный метод:

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

@Matt Handy: Set , безусловно, можно заказать, некоторые реализации (например, TreeSet), другие нет (например, HashSet). Основное различие между Set и List - это обработка дубликатов.

Изменить: я был слишком быстр, чтобы обвинить Primefaces. Похоже, что корень проблемы кроется в самой реализации JSF, которая не предоставляет DataModel для наборов. Дополнительные сведения см. здесь.

person jan groth    schedule 30.03.2011
comment
Я думаю, что если вы хотите полагаться на порядок, вам нужно использовать список. Вопрос Set / List уже обсуждался ранее. См. этот вопрос. - person Matt Handy; 30.03.2011
comment
В целом это неверно (поскольку в некоторых ответах в обсуждениях, на которые вы ссылаетесь, также указывается). Чтобы устранить все сомнения: взгляните на TreeSet, это Набор с четко определенным естественным порядком, на который вы можете положиться. - person jan groth; 30.03.2011
comment
Что касается обвинения, Set не предлагает способов получить элементы по индексу. Это просто обязательно для JSF, чтобы найти нужные строки во время применения значений запроса, проверки, обновления значений модели и вызова этапов приложения всякий раз, когда отправляется форма с таблицей. - person BalusC; 31.03.2011
comment
new ArrayList<T>(Set <T>) был бы выходом ;-) Конечно, все предположения о порядке элементов зависят от реализации Set, но с тем же успехом могут быть варианты использования, в которых согласованный порядок не требуется. На мой взгляд, это могло бы заполнить пробел между настойчивостью (где наборы очень полезны) и презентацией. - person jan groth; 01.04.2011