Не удалось инициализировать прокси - нет сеанса

у нас есть ошибка, которая выглядит так:

Не удалось инициализировать прокси - нет SessionI '

Я работаю с Java, Hibernate и Spring. Эта ошибка возникает при попытке создать PDF-документ, и яm, следуя следующим шагам, чтобы сгенерировать его на лету и сохранить в базе данных.

Я отправил запрос в приложение через метод POST. Это создает PDF на лету и показывает пользователю.

Сразу после этого запроса я отправляю другой, но через ajax запрос. Это создаст тот же PDF, но сохранит его в БД.

Ошибка показывает, что запрос не может быть выполнен из-зане удалось инициализировать прокси - нет сеанса " ошибка.

Есть ли что-то, что я делаю неправильно, вызывая одни и те же методы дважды из одного сеанса пользователя? Может ли быть так, что сессия закрыта до завершения обоих запросов?

Надеюсь, кто-то может помочь мне понять, что происходит.

 Makoto25 мая 2013 г., 21:01
Ошибка в стороне, зачем вам делать два разных вызова для создания PDF? Сделайте это один раз, сохраните его, а затем извлеките его из базы данных.
 Jukka25 мая 2013 г., 22:18
Спящий вопрос. Покажите нам код вызова Ajax, чтобы мы могли помочь вам.
 Misael P25 мая 2013 г., 21:08
Когда я писал вопрос, я думал, что вы предлагаете то же самое. Но я хотел, чтобы кто-то с немного большим опытом подтвердил то же самое. И просто, чтобы сделать его более полезным ... Можете ли вы объяснить, почему "не удалось инициализировать прокси - нет сеанса " ошибка происходит в этом конкретном сценарии? заранее спасибо.

Ответы на вопрос(1)

Решение Вопроса

что Hibernate Session живет только для одного запроса. Он открывается в начале запроса и закрывается в конце. Вы угадали ответ: сессия Hibernate закрывается до завершения обоих запросов.

Что именно происходит? Ваши объекты сущности живут во время обоих запросов. Как? Они хранятся в сеансе HTTP (который называется «сеанс»).Я не могу дать много информации об используемой вами платформе, поэтому я не могуЯ не могу дать вам больше подробностей, но несомненно, что используемая вами структура каким-то образом удерживает ваши сущности в сеансе HTTP. Таким образом, инфраструктура упрощает работу с одними и теми же объектами для более чем одного запроса.

Когда начинается обработка второго запроса, код пытается получить доступ к некоторому объекту (обычно элементу коллекции), который лениво инициализируется hibernate. Сущность не привязана к сеансу гибернации, и поэтому она можетt инициализировать прокси hibernate перед чтением. Вам следует открыть сеанс и повторно присоединить к нему вашу сущность в начале обработки запроса ajax.

РЕДАКТИРОВАТЬ:

Я постараюсь дать краткое объяснение того, что происходит за кулисами. Все веб-платформы Java имеют один или несколько сервлетов, которые обрабатывают запросы. Сервлет обрабатывает каждый запрос (HttpRequest), создавая новый поток, который, наконец, выдаст ответ (HttpResponse). Метод, который обрабатывает каждый запрос, выполняется внутри этого потока.

В начале обработки запроса ваше приложение должно выделить ресурсы, необходимые для его обработки (транзакция, сеанс Hibernate и т. Д.). В конце цикла обработки эти ресурсы освобождаются (транзакция фиксируется, сеанс гибернации закрывается, соединения JDBC освобождаются и т. Д.). Жизненный цикл этих ресурсов может управляться вашей средой или может выполняться вашим кодом.

Чтобы поддерживать состояние приложения в протоколе без сохранения состояния как HTTP, у нас есть объект HttpSession. Мы (или структуры) помещаем на HttpSession информацию, которая остается актуальной между различными циклами запросов одного и того же клиента.

Во время обработки первого запроса Hibernate считывает (лениво) объект из базы данных. Из-за ленивой инициализации некоторые части этого объектаСтруктура s - это прокси-объекты Hibernate. Эти объекты связаны с сеансом гибернации, который их создал.

Фреймворк находит сущность из предыдущего запроса в объекте HttpSession, когда вы пытаетесь обработать второй запрос. Затем он пытается получить доступ к свойству от дочерней сущности, которая была лениво инициализирована и теперь является прокси-объектом гибернации. Прокси-объект hibernate - это имитация реального объекта, который запрашивает у своего сеанса hibernate заполнить его информацией из базы данных, когда кто-то пытается получить доступ к одному из его свойств. Это то, что пытается сделать ваш прокси в спящем режиме. Но его сеанс был закрыт в конце предыдущей обработки запроса, поэтому теперь он нене использовать сеанс гибернации для гидратации (наполнен реальной информацией).

Обратите внимание, что, возможно, вы уже открыли сеанс гибернации в начале второго запроса, но это не так.t знает о сущности, которая содержит прокси-объект, потому что эта сущность была прочитана другим сеансом гибернации. Вы должны повторно присоединить объект к новому сеансу гибернации.

Существует много дискуссий о том, как повторно присоединить отдельную сущность, но самый простой подход сейчас.session.update(entity)

Надеюсь, поможет.

 nakosspy25 мая 2013 г., 23:43
отредактировано с более подробной информацией о циклах обработки запросов
 user107191405 нояб. 2013 г., 00:53
Это именно та информация, которая мне была нужна, и она объясняет именно то поведение, которое я вижу. Спасибо!
 nakosspy25 мая 2013 г., 23:09
Ты понял. Те же данные, которые вы упоминаете, - это сущность, которая существует в вашей пользовательской сессии (HttpSession). Во время второго запроса hibernate пытается заполнить прокси-объект (который является имитацией реального объекта) информацией из базы данных. Прежде чем пытаться выполнить запросы, которые будут извлекать данные, hibernate пытается найти объект сеанса hibernate, связанный с этим прокси-объектом. Но объект прокси не связан с сеансом гибернации. Отцовская сущность прокси-объекта была отсоединена от сеанса после завершения первого запроса.
 Misael P26 мая 2013 г., 00:24
Я действительно ценю твою помощь. Это дает некоторое представление о том, в чем заключается моя проблема и как ее решить. Спасибо!
 Misael P25 мая 2013 г., 21:36
Я использую весну. Таким образом, согласно вашему ответу первый запрос работает с информацией, полученной из базы данных с использованием hibernate. Затем приходит второй запрос и пытается получить доступ к тем же данным, выполняя запрос, который завершается неудачно, поскольку первый запрос закрывает сеанс гибернации до того, как второй запрос завершит свою работу. Я прав?

Ваш ответ на вопрос