Как заново открыть сеанс Spring вместе с OpenSessionInViewInterceptor - PullRequest
0 голосов
/ 11 октября 2010

Я использую инфраструктуру Spring MVC с Hibernate.Все мои контроллеры используют OpenSessionInViewInterceptor.

Я получаю сообщение об ошибке «Не удалось инициализировать прокси-сервер - закрывающий сеанс» в методе onSubmit () моего контроллера.Я полагаю, что это потому, что Hibernate должен вернуться в базу данных для извлечения определенных объектов, которые были извлечены в качестве прокси, и OpenSessionInViewInterceptor уже закрыл сеанс..reattach () на объектах.

Мои вопросы:

a) Прав ли я в своем диагнозе?и б) есть ли лучший способ повторно открыть сеанс Hibernate?Есть ли способ программно повторно открыть сеанс в Hibernate без reattach ()?

Редактировать: трассировка стека ниже: когда я перебираю Set в моем методе отправки, я получаю ошибку

Data access failure: failed to lazily initialize a collection of role: com.companyname.apps.manager.domain.PriceChangeset.priceChanges, no session or session was closed

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.companyname.apps.manager.domain.PriceChangeset.priceChanges, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
    at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:163)
    **at com.companyname.apps.manager.service.impl.PriceChangesetServiceImpl.addChangesToSqlTransfer(PriceChangesetServiceImpl.java:263)
    at com.companyname.apps.manager.service.impl.PriceChangesetServiceImpl.approve(PriceChangesetServiceImpl.java:185)**
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:299)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:139)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy100.approve(Unknown Source)
    at com.companyname.apps.manager.webapp.controller.pricechanges.PriceChangeDetailsController.onSubmit(PriceChangeDetailsController.java:115)

Спасибо!

1 Ответ

2 голосов
/ 11 октября 2010

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

Если вы пытаетесь повторно присоединить объект Hibernate к новому сеансу, как часть нового запроса, то вам нужно использовать что-то вроде reattach()merge() и т. Д. В спящем режиме Session или EntitymManager.OpenSessionInViewInterceptor здесь вам не поможет.

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