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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как победить PersistentObjectException? 
V
    Опции темы
diablero
Дата 8.5.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Есть два объекта Client и Hit. Которые имеют связи один ко многим и многие к одному.
Объект Client создается при создании сессии и живет вместе с ней, содержит данные о пользователе.
Объект Hit создается при каждом обращении к ресурсу.

Код в котором создается Client:
Код

        ClientEntry entry;
        if(request.getSession().isNew()) {
            entry = new ClientEntry();
            request.getSession().setAttribute("clientEntry", entry);
        } else {
            return (ClientEntry)request.getSession().getAttribute("clientEntry");
        }


Все вместе в контроллере:
Код

EntityTransaction tx = null;
        try {
            tx = infinite.getEntityManager().getTransaction();
            tx.begin();

            ClientEntry clientEntry = sgpsd.analysisClient(request);
            sgpsd.getLogEntryManager().persist(clientEntry);

            HitEntry hitEntry = sgpsd.analysisHint(request);
            request.getSession().setAttribute("hitEntry", hitEntry);

            // обработка запроса

            hitEntry = (HitEntry)request.getSession().getAttribute("hitEntry");

            clientEntry.getHintCollection().add(hitEntry);
            hitEntry.setClientEntry(clientEntry);

            tx.commit();
        } catch (Exception err) {
            if (tx != null && tx.isActive()) {
                tx.rollback();
            }
        }


В настройках Томката параметр autoDeploy равен "true".

Проблема в следующем:

Если продеплоить какой-то класс или перезагрузить Томкат, то от всех клиентов которые в этот момент обращались к ресурсу валятся эксепшены:
Код

ERROR org.hibernate.PersistentObjectException: detached entity passed to persist: net.eucodes.infinite.sgpsd.data.ClientEntry 
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: net.eucodes.infinite.sgpsd.data.ClientEntry


И помогает только если закрыть браузер, и заново открыть. 
Т.е. как я понял, при деплое все активные сессии живы, но почему и при рестарте, мне так и осталось не ясным.

Как это решить я пока не знаю... smile 



Это сообщение отредактировал(а) diablero - 8.5.2008, 19:03


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 8.5.2008, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



А дело в том, что сессия живучее сервера smile Если ты заглянешь в директорию томкат/ворк/апп-наме, то увидишь там файл SESSIONS.ser. Вот там они и хранятся, что позволяет им пережить рестарт сервера.

Победить это дело несложно. В файле tomcat/conf/context.xml есть такие строчки:

Код

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->


Раскомментируй эту настройку, и будет тебе щастье smile



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 8.5.2008, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Я хотел найти вариант, который не требует вмешательства в конфиг сервера.
И вроде нашел. 
Для объектов, которые изменяются в пределах не одной транзакции, нужно использовать метод merge()
класса EntityManager, а не persist.


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
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.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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