#java #jsf #jakarta-ee
#java #jsf #джакарта-ee
Вопрос:
Есть ли причина, по которой a, например, Set<MyObject> objects = new HashSet<MyObject>();
не должен работать в JSF Datatable? Он работает со списком.
Комментарии:
1. Конечно, потому что элементы HashSet не упорядочены. Любая вставка или удаление в наборе может привести к изменению порядка его элементов.
2. @JBNizet Это должно быть ответом.
3. Я не эксперт в JSF и поэтому не уверен, что это причина (или единственная причина). Поэтому я позволю другим ответить на более точный ответ.
Ответ №1:
Что касается того, почему a Set
вообще не поддерживается, это связано с тем, что эта структура данных никогда не предназначена для хранения коллекции объектов, упорядоченных по индексу. Это List
делает, и эта структура данных является наиболее разумной структурой данных для представления значения UIData
компонента. DataModel
Интерфейс, который представляет обернутое значение UIData
компонентов и содержит индексы строк и запоминает текущую строку для итерации при рендеринге и обработке отправки формы при обратной передаче, поддерживает из классов коллекции Java только List
интерфейс в стиле ListDataModel
.
После длительного процесса принятия решений (особенно под давлением сообщества Hibernate / JPA, которое обычно использует Set
for n-m отношений), команда разработчиков спецификации JSF для предстоящего JSF 2.2 наконец решила позволить DataModel
интерфейсу поддерживать Collection
интерфейс, а не только интерфейс List
, с помощью новой CollectionDataModel
реализации. Это также поддерживает наборы. См. Также выпуск спецификации JSF 479. Вы должны иметь в виду только использование LinkedHashSet
вместо HashSet
, конечно, если вы намерены иметь редактируемую таблицу данных. A LinkedHashSet
поддерживает порядок элементов.