Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Как победить PersistentObjectException?


Автор: diablero 8.5.2008, 18:59
Есть два объекта 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 


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

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

Код

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


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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)