2010-10-11 2 views
0

Я использую среду 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) 

Спасибо!

+1

Весь смысл 'OpenSessionInViewInterceptor' заключается в том, что у вас нет * * для повторного открытия сеанса. Где происходит исключение? – skaffman

+0

его в моем onSubmit(), я только что опубликовал трассировку стека – benhsu

+0

Вы пытаетесь сохранить сеанс открытым по нескольким запросам? – skaffman

ответ

2

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

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

Смежные вопросы