Обработка сеанса гибернации в весенних веб-сервисах

StackOverflow https://stackoverflow.com/questions/467290

Вопрос

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

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

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

Это было полезно?

Решение 2

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

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" />

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

Другие советы

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

Эта статья http://springtips.blogspot.com/2007/06/spring-and-hibernate.html показывает, как это сделать.

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

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