![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| gimp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 6.2.2007 Репутация: нет Всего: нет |
Получаю какую-то информацию из БД (с помощью Hibernate):
И дальше мне нужно немного поработать с этим списком и его элементами, но не попортив информацию в БД. Обычно, для таких случаев есть метод clone(), который возвращает копию, которую можно смело менять, но в интерфейсе List почему-то нет метода clone(). Конечно же можно привести к ArrayList, у которого есть метод clone(), но ведь List, которые возвращает Hibernate, может и не привестись к ArrayList. Да и потом, насколько я понял из javadoc, метод clone() ArrayList'а элементы не копирует и все равно у меня все испортиться. Как лучше поступать в подобных случаях? P. S. я понимаю, что вопрос дурацкий, но просьба сильно не ругаться, я -- начинающий |
|||
|
||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 31 Всего: 132 |
Можно воспользоваться методом copy(java.util.List, java.util.List) класса java.util.Collections.
|
|||
|
||||
| gimp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 6.2.2007 Репутация: нет Всего: нет |
||||
|
||||
| last |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 4.7.2006 Репутация: нет Всего: нет |
Это не решит проблемму до конца, тк. в получившемся листе будут копии ссылок на объекты, а не ссылки на копии объектов.
При попытке обратиться к свойствам любого бина в новом List вне сессии Hibernate получим исключение NullPointerException. Вам придется написать для вашего List некий враппер, который переопределяет метод clone. В этом методе нужно склонировать каждый объект в вашем листе и добавить в новый лист. Естественно любой объект в вашем листе должен иметь метод clone и все поля этих объектов и тд. Т.е. придеться писать глубокое клонирование. Замечу, что метод Object.clone осуществляет только поверхностное копирование, те не копирует весь граф объектов, а ограничивается копированием ссылок. |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
Когда-то очень давно кто-то очень умный сказал мне: Только сам объект знает как себя клонировать. Поэтому: а) невозможно создать внешнюю процедуру корректно клонирушую произвольные объекты; б) Для каждого клонируемого объекта, где бы он ни содержался, надо прописывать метод clone.
-------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| Tony |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1159 Регистрация: 3.3.2006 Где: Riga Репутация: нет Всего: 12 |
Есть jakarta BeanUtils. Там есть два метода clone i copy bean.
?!?!?!? Пока ты не вызовешь save у хипера, данные не поменяются в ДБ. Может я 4тото не понял, то опиши. |
|||
|
||||
| Alexis |
|
||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 14.8.2006 Где: Казань Репутация: нет Всего: 5 |
У меня та же проблема. Хотел создать тему в J2EE, все-таки там обычно обсуждают Hibernate, но раз уже есть такая тема, то напишу здесь.
По причинам, которые описал last, не помогает. Правда к свойствам я обратиться могу, но вот изменение элементов списка сказываются и на БД. Может быть я не правильно пользуюсь Hibernate. Опишу подробнее. Классы реализации DAO у меня построены примерно следующим образом:
Класс HibernateUtil содран с Hibernate In Action
Commit делается в фильтре (у меня WEB-приложение):
В общем-то в чем состоит проблема. Получаю я, к примеру, список категорий и временно (т. е. их имена в БД менять мне не нужно) меняю их имена:
В результате имена меняются и БД. В-принципе, мне подходит этот вариант, так сейчас и сделано. Но как-то хлопотно получается, да и что-то мне подсказывает, что как-то неправильно я hibernate использую. Хотелось бы узнать как уважаемые участники поступают сами в таких ситуациях, общепринятый подход так сказать. |
||||||||||||
|
|||||||||||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Что храниться в List?
Метод clone() у Object имеет модификатор protected. Так что мы должны будем приводить объекты к некому типу у которого метод clone() имеет модификатор public. Добавлено @ 15:20 В принципе есть методика глубокого клонирования, через сериализацию. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Alexis |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 14.8.2006 Где: Казань Репутация: нет Всего: 5 |
||||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Клонируй список.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Alexis |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 14.8.2006 Где: Казань Репутация: нет Всего: 5 |
||||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |