| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Работа с коллекциями |
| Автор: greef 31.1.2008, 21:26 | ||
Не могу найти ошибку в след коде. Цель: получив id объектов извне (по этим id можно найти объекты), засунуть потом эти объекты в List.
cc.getViewuser().getFriendlist() - массив id-ков приходящий извне. Те тут будет 1, 4, 15 etc cc.getViewuser().getFriendlist().get(i); - тут получаю эти id-ники listFreinds.add(userManager.getUser(idFriend)); - а тут заполняю listFreinds объектами класса User имеющие id: 1, 4, 15 etc |
| Автор: Kangaroo 31.1.2008, 21:36 |
| greef, а какая ошибка? Случайно не ArrayOutOfBound иксепшн? |
| Автор: v2v 31.1.2008, 22:59 | ||
|| \/
? |
| Автор: greef 1.2.2008, 01:01 | ||||||||
Да, спасибо. Ошибка ArrayOutOfBound, а решением было
Только теперь ошибок нет. Но сохранение друзей не происходит. Хотя остальные поля объекта сохраняются успешно.
Те изменения в поле Name и тд, сохраняются успешно. А listFreinds нет. Может проблему в маппинге?
Модель User
Добавлено через 9 минут и 44 секунды Поспешил с вопросом inverse="true" убрал и все сохраняется. Вот тут вопрос. Какое значени и в каких случаях надо использовать 1) inverse="true" 2) cascade="all" Документация не дала полного ответа. Заранее спасибо |
| Автор: greef 2.2.2008, 16:57 | ||
| LSD Спасибо. Есть еще вопрос по коллекции.
Я должен добавить в список друзей юзеров - выбранного юзера (ourUser), соответственно если он там уже есть его добавлять не надо. Поэтому я перебираю всех юзеров tempUser и просматриваю список друзей этих юзеров tempFriends - если этот список содержит выбранного юзера, то ничего не делаю. Иначе добавляю. Но у меня он добавляются еще и еще - таким образом получаю что в друзьях у юзеров будет повторятся выбранный юзер. |
| Автор: Platon 2.2.2008, 17:03 |
| Я честно сказать, не сильно уверено, но может быть тебе корректно задать equals и hashCode? |
| Автор: LSD 2.2.2008, 22:19 | ||
Ничего не понял. |
| Автор: greef 2.2.2008, 23:02 |
| Есть список людей. У каждого есть друзья. Вот я беру одного человека. И в список его друзей могу кого-то добавить (из имеющихся людей), кого-то удалить (из ранее выбранных друзей). Те работаю со списком друзей для определенного человека. НО если я, например, у Иванова в друзьях был Сидоров. И после изменения я оставил его в друзьях, то он у меня еще раз добавляется хотя по идеи if(!tempFriends.contains(ourUser)) не должно это позволить. |
| Автор: Kangaroo 2.2.2008, 23:11 | ||
| Опять непонятно И еще, объясните, пожалуйста, смысл этих строчек:
? Зачем его удалять, если потом сразу его же добавлять... |
| Автор: greef 2.2.2008, 23:34 | ||||||||||
За это сорри. Просто пробовал разл варианты. Забыл удалить Хорошо тогда объясню по другому. Проблема - в коллекию добавляется объект даже если он в ней есть. Получается что у Иванова может получится 10 Сидоров в друзьях. Описание - Из view приходит инфа от юзере. Имя, пол, список его друзей (checkbox). В онсабмит я сохраняю изменения. Сначало все поля типа имени, адреса ид (ourUser.setName(cc.getViewuser().getName()); ourUser.setLocation(cc.getViewuser().getLocation());). Потом мне нужно сохранить список друзей - ourUser.setFriendlist(tmpList);. Для этого я и проделываю такую операцию. Если можете посоветовать другой вариант решения проблемы, буду очень благодарен. Привожу пример контролера, модели, маппинга и команд класса. PS Думаю что ошибка именно из-за неправильной работы с коллекциями, хотя может быть что то напутал в маппинге.
Model
Mapping
Command class
|
| Автор: nornad 3.2.2008, 00:58 |
| greef, тебе уже посоветовали решение - перегрузи в своём классе equals и hashCode и будет тебе счастье. Корректно перегрузи только. Добавлено через 1 минуту и 47 секунд Просто, у тебя в коллекции при проверке на наличие юзверя происходит сравнение по ссылкам, а ссылки могут быть разными. Сравнивать же надо у тебя данные, а их расположение в памяти. |
| Автор: nornad 3.2.2008, 16:10 | ||||
Смотрим javadoc по поводу того, как работает метод List.contains:
Вывод - если ссылки не нулевые, то надо сравнивать данные методом equals. Рисуем себе equals:
Так как у тебя идёт завязка на таблицу в базе, где есть идентификатор - этого для сравнения хватит (если ещё считать, что новая запись с тем же именем должна иметь другой индентификатор). То есть, уникальность организуется за счёт идентификаторов. hashCode я перегружать не силён, да и данная перегрузка equals не оптимальна, так что будет неплохо, если знающие люди поправят и дополнят. |
| Автор: greef 3.2.2008, 16:58 | ||
| Класс User extends BaseObject. А в BaseObject переопределены equals и hashCode. Или я не так понял?
|
| Автор: nornad 3.2.2008, 18:51 |
| По коду прям всё сразу стало ясно, как там происходит сравнение. Либо откопай код непосредственно сравнения, либо перегрузи и проверь. |
| Автор: nornad 3.2.2008, 20:09 |
| Кстати, в моём иквалзе стоит ещё добавить if(!(obj instanceof User)) return false; (ну или вообще на точное соответствие классов проверять, если надо). |