Обработка сеанса гибернации в весенних веб-сервисах
-
19-08-2019 - |
Вопрос
Я использую 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".