Spring + Hibernate: не удалось инициализировать прокси без сеанса. Что делать, если в DAO произошло исключение? - PullRequest
1 голос
/ 17 января 2012

На моих страницах JSP получено could not initialize proxy no Session исключение.

Вот что я делаю;

Есть DAO для Hibernate. Это не специальные классы. У них просто есть экземпляры Hibernate SessionFactory с автоматическим подключением. Да, я использую чистый Hibernate для доступа к БД.

Функции в классах DAO снабжены @Transactional(rollBackFor=Exception.class), и конфигурации My spring подготовлены соответствующим образом. Также мои сущности / контроллеры также настроены с аннотациями и т. Д.

У меня нет отдельного слоя классов обслуживания. Мои Сервисы и DAO перекрываются. они одинаковы. Если классу Service требуется доступ к БД, он просто помечается @Repository, а не @Service

До этой ошибки все работало отлично. (У меня есть сотни классов / DAO / юридических лиц и т. Д.)

Теперь мне нужно вызвать две функции DAO / Service на одном из моих контроллеров. Я вызываю вторую функцию DAO только тогда, когда первая вызывает исключение.

Мне нужно выдать исключения, основанные на некоторых условиях, чтобы откатить изменения, сделанные при первом вызове DAO. Второй вызов просто чтобы показать некоторую информацию из БД пользователю, который ввел неправильный ввод.

Я не знаю, почему, но работает второй вызов DAO, он получает классы из БД. затем я пересылаю эти классы в мой атрибут Model на моих контроллерах, чтобы мои JSP могли их отображать.

Но когда мои страницы JSP пытаются получить доступ к атрибутам этих классов, я получил could not initialize proxy no Session исключение.

Итак, вот мой вопрос, что мне делать, чтобы избежать этих ошибок.

Должен ли я что-то делать с транзакцией / сеансом гибернации при первом вызове DAO? Потому что я ничего не делаю. Я просто получаю сеанс и получаю / сохраняю / обновляю и т. Д. На нем. Я думаю, что атрибут @Transactional будет обрабатывать проблемы транзакции, а атрибут @Repository обрабатывает проблемы сессии.


Я уже пытался решить проблему с отложенной загрузкой. Я уже установил фильтр OpenSessionInViewFilter в свои конфигурации.

Но никто из них не решил мою проблему.

Любые советы / мысли?

Ответы [ 2 ]

1 голос
/ 19 января 2012

Я решил проблему сейчас:)

Проблема была в том, что я неправильно понял, как работает Hibernate с Spring Framework, к сожалению:)

Исключение возникает на странице JSP, когда я сравнивалзначения двух разных прокси-серверов Hibernate, каждый из которых получен из отдельных сеансов Hibernate.

Как я уже описал в вопросе, при первом вызове DAO я получил прокси, а затем при втором вызове DAO получил другой прокси, которыйпринадлежит к другим сессиям Hibernate.Следовательно, первый прокси-сервер - это автономный прокси-сервер гибернации с «закрытым сеансом», я получил это исключение.

Чтобы решить эту проблему, попытайтесь сделать ваши отсоединенные прокси-серверы постоянными, а затем сравнить их значения.

Но я решил эту проблему путем рефакторинга своего кода, чтобы не открывать два разных сеанса для извлечения значений из БД.

0 голосов
/ 17 января 2012

Spring должен обернуть службу аннотациями @Transactional с помощью прокси-оболочки, которая будет инициализировать транзакции, поэтому вы не должны делать это вручную, когда вам не нужно использовать более одной транзакции в одном методе.

InКонфигурация XML, которую необходимо добавить <tx-annotation-driven /> в каждый файл XML, который объявляет компоненты с аннотациями @Transactional.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...