Я использую среду Spring MVC с Hibernate. Все мои контроллеры используют OpenSessionInViewInterceptor.Как повторно открыть сеанс Spring в сочетании с OpenSessionInViewInterceptor
Я получаю «не удалось инициализировать прокси-сервер - закрытие сессионных сессий» в методе onSubmit() моего контроллера. Я считаю, что это связано с тем, что Hibernate необходимо вернуться к базе данных, чтобы получить определенные объекты, которые были получены в качестве прокси, и OpenSessionInViewInterceptor уже закрыл сеанс.
Я работаю над этими проблемами, используя HibernateTemplate(). Reattach() на объектах.
Мои вопросы:
а) я прав в своем диагнозе? и б) есть ли лучший способ повторно открыть сеанс Hibernate? Есть ли способ программно повторно открыть сеанс в Hibernate без повторной привязки()?
Edit: трассировка стека ниже: когда я перебрать набор в моем представить метод, который я получаю ошибку
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)
Спасибо!
Весь смысл 'OpenSessionInViewInterceptor' заключается в том, что у вас нет * * для повторного открытия сеанса. Где происходит исключение? – skaffman
его в моем onSubmit(), я только что опубликовал трассировку стека – benhsu
Вы пытаетесь сохранить сеанс открытым по нескольким запросам? – skaffman