Обработка Hibernate-сессии в весенних веб-сервисах - PullRequest
0 голосов
/ 22 января 2009

Я использую spring-ws с Jaxb2Marshaller, PayloadRootAnnotationMethodEndpointMapping и GenericMarshallingMethodEndpointAdapter для настройки моих веб-служб с помощью аннотаций @Endpoint и @PayloadRoot.

Когда я пытаюсь использовать DAO моего проекта, я могу загрузить объекты из базы данных, но как только я пытаюсь получить доступ к свойствам внутри моего сервиса, которые должны загружаться лениво, я получаю исключение org.hibernate.LazyInitializationException - не могу инициализировать прокси - нет сеанса.

В моем веб-приложении spring-mvc OpenSessionInViewInterceptor обрабатывает сессии. Как настроить проект веб-службы для автоматического создания сеанса Hibernate для каждого вызова веб-службы?

Ответы [ 2 ]

2 голосов
/ 22 января 2009

Оберните org.springframework.aop.framework.ProxyFactoryBean вокруг объекта в контексте Spring, для которого требуется наличие сеанса гибернации.

В этой статье http://springtips.blogspot.com/2007/06/spring-and-hibernate.html показано, как это сделать.

Если при использовании сеансов возникают проблемы из-за отложенной загрузки коллекций, существует как минимум 2 возможных исправления:

  • Добавить вызов Hibernate.initialize () в коллекцию в коде, который выполняется с доступным сеансом Hibernate - http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Hibernate.html#initialize(java.lang.Object)
  • Используйте не ленивую коллекцию, добавив в отображение lazy = "false" - следите за тем, чтобы при использовании этой опции вы могли легко заставить hibernate загрузить всю базу данных с помощью пары неправильно размещенных опций lazy = "false".
0 голосов
/ 27 января 2009

Тем временем я нашел решение. Эта запись на форуме дала мне подсказку:

http://forum.springframework.org/showthread.php?t=50284

В основном я добавил аннотации @Transactional в свой класс реализации веб-сервиса. Сложнее было сказать Spring, чтобы он использовал оригинальный класс (а не прокси, созданный tx: annotation-driven), чего я достиг, используя следующую конфигурацию:

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping" >
    <property name="order" value="1" />
</bean>

<tx:annotation-driven mode="proxy" order="200" proxy-target-class="true" />

Порядок операторов конфигурации тоже важен.

...