В поисках решения Spring (3.0.5): Сеанс Hibernate не привязан к потоку, а конфигурация не позволяет создавать нетранзакционный сеанс - PullRequest
0 голосов
/ 27 февраля 2011

У меня проблема с транзакциями в Spring 3.0.5. В моем случае я получаю так называемое исключение «Сеанс Hibernate не привязан к потоку, а конфигурация не позволяет создавать нетранзакционный сеанс здесь» ... Я уже все перепробовал. Я вижу в своем журнале, что транзакционные сервисы обнаруживаются и регистрируются как бины Spring, и я также вижу в журналах, что они проксируются и связаны с базовыми перехватчиками транзакций Spring. (Советую) Когда я запускаю свое приложение Spring MVC, мой контроллер будет вызывать службу ...... :-(, но перехватчики транзакций не срабатывают. (??) Я ожидаю, что мой прокси-сервер Spring откроет сеанс и запустит транзакция перед вызовом моего метода целевой службы. Так как этого не происходит, я получаю вышеуказанное исключение. Я почти два дня занимался этой проблемой. Перепробовал все, что нашел в интернете ... но тщетно.

У меня многоуровневая архитектура: презентация (springmvc), служба (аннотированная транзакция), доступ к данным (классическая сессия Spring / Hibernate). Мои объекты модели помечены с помощью jpa (javax.persistence. *). Мои весенние контекстные конфигурационные файлы разделены в appContext.xml, appContext-service.xml и appContext-dao.xml. Я определил свой Spring LocalSessionFactoryBean, Datasource и TransactionManager (HibernateTransactionManager) в appContext-dao.xml. Я поместил в appContext-service.xml, где находятся мои реализации службы. Во все мои конфигурационные файлы, которые я включил, и для обнаружения моих компонентов с помощью аннотаций Controller, Service и Repository.

Я ценю любую помощь.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2011

Это похоже на доступ к лениво загруженному списку или множеству ваших дао после закрытия транзакции.Обычно это происходит, если вы обращаетесь к этому списку вместо контроллера, поскольку ваш контроллер, вероятно, вызывает методы в области транзакции, а затем покидает транзакцию и перенаправляет загруженный компонент в представление.

Простые решения:

  • Конфигурирование вашего компонента данных для активной загрузки
  • Принудительная загрузка зависимостей в контроллере (просто проходите через них)
  • посмотрите на этостатья и, возможно, также довольно много прямо здесь, на SO, о отложенной загрузке / отложенном извлечении ассоциаций типа «один ко многим» и т. п.
0 голосов
/ 27 февраля 2011

Звучит так, как будто вы все делаете правильно и знаете, что делаете.Мы мало что можем сделать здесь, если вы не покажете какую-то конфигурацию.

Я бы посоветовал отладку.

Во-первых: у вас есть модульные тесты на уровне сервиса, которые проверяют запросыиспользуете?Возможно, вы можете найти ошибку на сервисном уровне.

Затем: отладьте приложение MVC, проверьте типы внедренных сервисов.Убедитесь, что они являются прокси, а не исходными типами.

  • Если они являются исходными типами, у вас есть ошибка в конфигурации вашей транзакции.
  • Если они являются прокси-серверами, просмотрите методы запроса и убедитесь, что применяется логика транзакции.
...