| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > JSF: Nested h:datatables from Hibernate beans |
| Автор: landpro 15.10.2007, 09:03 |
| Добрый день, господа! Каким же образом реализовать эту тривиальную задачу? Описываю ситуацию. Есть hibernate сущности - UserGroup & User.. Хочется вывести на странице все UserGroups и под каждой группой ее Users. Делаю страничку JSF, в ней регистрирую контроллер UserGroupController, в котором делаю метод getUserGroups(), который в свою очередь делает HQL запрос всех групп, получает Set, конвертит в ListDataModel и возвращает. Ok, группы вывел. Как же вывести Users? У UserGroup как водится есть атрибут - коллекция Users. Уж очень хочется написать что-нибудь типа h:datatable value="#{userGroupController.users}", однако нельзя - коллекция Set. Вопрос в том, где мне конвертировать Set в ListDataModel? Делать это прямо в классе UserGroup - несерьезно - это класс относится к слою модели, а ListDataModel - это тип данных представления. Жду ваших мыслей, умы Заранее спасибо! |
| Автор: ivg 15.10.2007, 09:43 |
| Извиняюсь за предыдущие ответы на ваш вопрос, но хотелось бы знать, вариант указанный http://forum.vingrad.ru/index.php?showtopic=176481&view=findpost&p=1283347 не работает? А по этой теме можно использовать javax.faces.model.ArrayDataModel, для этого значение атрибута value элемента <h:dataTable ... /> должно иметь тип Object[], то есть в данном случае проще всего будет указать value="#{userGroupController.users.toArray}" |
| Автор: landpro 15.10.2007, 10:17 |
| ivg, спасибо за ответ и внимание вариант с <list> отказывается правильно работать, уж не знаю почему. На сановском форуме мне вообще написали, что неправильно менять модель из-за проблем с выводом.... Типа это задача бизнес слоя. Согласившись с этим, я написал конвертор для коллекции первого уровня вложенности (кстати, в этом же месте можно теперь управлять сортировкой элементов в коллекции), но теперь не понятно в каком месте вставить конвертор для внутренних уровней. Не совсем понял идею с #{userGroupController.users.toArray}. А так разве можно? т.е. вызовется toArray(), а не getToArray() ? |
| Автор: landpro 15.10.2007, 12:45 |
| Да, ivg! Теперь ты меня полностью понял, супер! Понятно, что это легко добавить метод в модель, но опять же этот метод будет относиться к бизнес логике.... На верно пока так и сделаю, чтобы не стопорится, если что интересней придумаю - напишу. Со статическим методом это, конечно, гуд. Но опять же нюанс. Когда переводишь Set в List хочется управлять сортировкой, а это еще один параметр В общем пока буду жить так и двигаться дальше. Спасибо! |
| Автор: ivg 15.10.2007, 13:23 |
| Ещё вариант: переписать класс javax.faces.component.UIData, таким образом, чтобы он при получении Set<?>, автоматом конвертил бы его в List<?> и выбирал соответственно ListDataModel. ( Ну или если уж совсем по правильному, то такой подход подразумевает создание своего компонента, который в этой части будет раcширять поведение стандартного h:dataTable. Как такой вариант? До кучи, можно будет придумать и атрибут, который будет указывать на условие(я) сортировки при конвертировании. |
| Автор: Foo 22.10.2007, 09:26 | ||
Если я не ошибаюсь, если написать такой метод getUserList() который будет конвертить Set в List, то он не вызовется, т.к. кроме того что есть метод типа getXxx должно быть ещё поле xxx и метод setXxx, и даже тогда JSF не будет вызывать метод, а возьмет значение самого поля xxx. |