| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Метод clone для List |
| Автор: gimp 6.2.2007, 15:23 | ||
Получаю какую-то информацию из БД (с помощью Hibernate):
И дальше мне нужно немного поработать с этим списком и его элементами, но не попортив информацию в БД. Обычно, для таких случаев есть метод clone(), который возвращает копию, которую можно смело менять, но в интерфейсе List почему-то нет метода clone(). Конечно же можно привести к ArrayList, у которого есть метод clone(), но ведь List, которые возвращает Hibernate, может и не привестись к ArrayList. Да и потом, насколько я понял из javadoc, метод clone() ArrayList'а элементы не копирует и все равно у меня все испортиться. Как лучше поступать в подобных случаях? P. S. я понимаю, что вопрос дурацкий, но просьба сильно не ругаться, я -- начинающий |
| Автор: tux 6.2.2007, 17:33 |
| Можно воспользоваться методом copy(java.util.List, java.util.List) класса http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html. |
| Автор: gimp 6.2.2007, 18:20 | ||
Спасибо! |
| Автор: last 8.2.2007, 16:15 |
| Это не решит проблемму до конца, тк. в получившемся листе будут копии ссылок на объекты, а не ссылки на копии объектов. При попытке обратиться к свойствам любого бина в новом List вне сессии Hibernate получим исключение NullPointerException. Вам придется написать для вашего List некий враппер, который переопределяет метод clone. В этом методе нужно склонировать каждый объект в вашем листе и добавить в новый лист. Естественно любой объект в вашем листе должен иметь метод clone и все поля этих объектов и тд. Т.е. придеться писать глубокое клонирование. Замечу, что метод Object.clone осуществляет только поверхностное копирование, те не копирует весь граф объектов, а ограничивается копированием ссылок. |
| Автор: _Y_ 9.2.2007, 11:18 |
| Когда-то очень давно кто-то очень умный сказал мне: Только сам объект знает как себя клонировать. Поэтому: а) невозможно создать внешнюю процедуру корректно клонирушую произвольные объекты; б) Для каждого клонируемого объекта, где бы он ни содержался, надо прописывать метод clone. |
| Автор: Tony 9.2.2007, 12:00 | ||
Есть jakarta BeanUtils. Там есть два метода clone i copy bean.
?!?!?!? Пока ты не вызовешь save у хипера, данные не поменяются в ДБ. Может я 4тото не понял, то опиши. |
| Автор: LSD 3.3.2007, 15:19 |
| Что храниться в List? Метод clone() у Object имеет модификатор protected. Так что мы должны будем приводить объекты к некому типу у которого метод clone() имеет модификатор public. Добавлено @ 15:20 В принципе есть методика глубокого клонирования, через сериализацию. |
| Автор: Alexis 3.3.2007, 15:27 |
Объект типа Category Клонировать эти объекты не проблема, но может быть есть способ как-то "отцепить" этот список, чтобы Hibernate не следил за его изменением? Или в таких случаях обычно делают клонирование? |
| Автор: LSD 4.3.2007, 12:19 |
| Клонируй список. |
| Автор: Alexis 4.3.2007, 13:02 |
Спасибо за ответ. Тогда так и оставлю клонирование. |