Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> different object with the same identifier value... was already associated with the session. 
V
    Опции темы
Fedrus
Дата 6.11.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



Здравствуйте все!
Есть форма на которую выводится список юзеров.
При нажатии на кнопку едит (возле соответствующего юзера) отображается (на этой же форме) форма редактирования юзера!! здесь!! я запрашиваю соответствуещего юзера и заполняются поля имя логин и тд редактирую информацию и нажимаю кнопку выполняется код:
Код

public String editAction() {
        IndexControl indexControl = this.getIndexControl();
        this.user.setId(indexControl.getUserId());
        Session session = null;
        Transaction tx = null;
        try {
            
            session = HibernateSessionFactory.getSession();
            session.clear();
            tx = session.beginTransaction();
            User userr = (User) session.createQuery(
            "from User as m where m.id=?").setLong(
                    0, indexControl.getUserId())
            .uniqueResult();
            userr = this.user;
            session.update(userr);
            tx.commit();
            FacesUtil.addMessage("User was edited.");
            // this.setAction("");
        } catch (Exception e) {
            tx.rollback();
            FacesUtil.addErrorMessage(e.getLocalizedMessage());
        }
        // setAction("add_action_success");
        return "";
    }


Здесь я попробывал получить юзера присвоить ему измененные значения и поместить его обратно в базу но опять та же ошибка:
a different object with the same identifier value was already associated with the session
раньше пытался просто 
Код

public String editAction() {
        IndexControl indexControl = this.getIndexControl();
        this.user.setId(indexControl.getUserId());
        Session session = null;
        Transaction tx = null;
        try {
            
            session = HibernateSessionFactory.getSession();
            session.clear();
            tx = session.beginTransaction();
            session.update(user);
            tx.commit();
            FacesUtil.addMessage("User was edited.");
            // this.setAction("");
        } catch (Exception e) {
            tx.rollback();
            FacesUtil.addErrorMessage(e.getLocalizedMessage());
        }
        // setAction("add_action_success");
        return "";
    }


Помогите пожалуйста.
Впринципе понятно что взят один юзер потом я изменяю его и хочу именного его проапдейтить от куда берется другой?
Нужен еще какой код допишу.
--------------------
Если вы идете через ад, идите не останавливаясь.
PM MAIL   Вверх
Kangaroo
Дата 6.11.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



Fedrus
а где ошибка вываливается?


--------------------
Lost....
PM MAIL MSN   Вверх
Fedrus
Дата 6.11.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



Интересно получилось))
В пятницу сидел искал решение и дописал  session.clear(); всеравно, ошибка выбрасывалась на  session.update(user);(может плохо задиплоился проект)
Вобщем я искал решение дальше попробовал получать user и егоже и класть обратно (тут опять начала возникать эта ошибка) ))))
сегодня пришел уткнуся еще подумал и решил на форуме написать)) 
Сейчас просиш где ошибка вываливается убираю 
Код

 User userr = (User) session.createQuery(
            "from User as m where m.id=?").setLong(
                    0, indexControl.getUserId())
            .uniqueResult();
            userr = this.user;


иии нет ошибки ну я просто офигел сначало  smile  ну думаю чудеса)) но посмотрел получьше и вспомнил что добавленно 
 session.clear(); вот в тут то все и стало понятно хотя несовсем не доконца
Вот с clear работает но не моглибы расказать возможные проблеммы использования этого метода может есть другое решение))

Это сообщение отредактировал(а) Fedrus - 6.11.2007, 13:36
--------------------
Если вы идете через ад, идите не останавливаясь.
PM MAIL   Вверх
mindflyer
Дата 9.11.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

Репутация: 3
Всего: 4



Цитата(Fedrus @  6.11.2007,  12:21 Найти цитируемый пост)
Впринципе понятно что взят один юзер потом я изменяю его и хочу именного его проапдейтить от куда берется другой?

У тебя есть один объект, который "this.user" (назовём его первый) и второй, который ты взял из базы
Код
User userr = (User) session.createQuery  ...

Выполняя код 
Код
 userr = this.user; 

ты устанавливаешь ссылку userr на первый объект, т.е. теперь userr указывает на тот же объект, что и this.user (ну это очевидно).
И когда ты пытаешься сделать
Код
session.update(userr);

то ты отдаешь hibernate первый объект. Но у него в этой сессий уже есть второй объект с тем же id, о чём он тебе честно и говорит.

Если ты хочешь проапдейтить объект, то ты должен установить свойства именно у того объекта, который ты прочитал из базы данных.
Есть разные варианты, но проще всего просто скопировать свойства из this.user в userr.
Сразу через GUI редактировать объект, полученный из бд, не советую, т.к. в общем случае, чем меньше длится транзакция, тем лучше.
Также можешь глянуть документацию на методы merge и update в отношении detach объектов - твой первый объект как раз является detach объктом.

session.clear() - если кратко:  очищает кэш сессии, т.е. после вызова этого метода сессия "забывает" про ранее загруженные объекты.  Лучше его не использовать, если нет опыта работы с hibernate. (а когда он появится, то вряд ли возникнет необходимость его юзать smile )

Это сообщение отредактировал(а) mindflyer - 9.11.2007, 19:20
PM MAIL ICQ   Вверх
YuryIlinikh
Дата 25.3.2008, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.8.2007

Репутация: нет
Всего: нет



После выбора юзера закрой для него сессию и он станет detached после его можно менять, и делать update
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0778 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.