Spring OpenSessionInViewInterceptor не работает - PullRequest
5 голосов
/ 14 февраля 2011

У меня была (не) известная проблема с гибернацией и отложенной загрузкой при визуализации представлений .... Как говорят многие, единственные два решения:

  • Сделать метод транзакционным (и это не всегда желательно)
  • Использовать OpenSessionInViewInterceptor.

Последнее предпочтительнее ИМО. В любом случае, я не уверен, что этот перехватчик вообще срабатывает (фактически я получаю то же исключение при загрузке Lazy, и ничего не меняется):

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: it.jsoftware.jacciseweb.beans.Listino.prodotti, no session or session was closed

Я использую простые сопоставления URL на основе аннотаций, поэтому, читая документы для Spring 3, я использую это в моем servlet-context.xml:

<bean id="handlerMapping"
        class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <!-- <property name="order" value="2" /> -->
        <property name="interceptors">
            <list>
                <ref bean="openSessionInViewInterceptorInst" />
            </list>
        </property>
    </bean>

Что должно сделать трюк. Но это не работает, и я получаю исключение. Как мне убедиться, что мой перехватчик стреляет? Как мне это решить?

Ответы [ 3 ]

15 голосов
/ 14 февраля 2011

Используете ли вы аннотацию @RequestMapping? Если я правильно помню, была проблема с помещением перехватчика в компонент URL. В Spring 3.0 вы можете определить перехватчик следующим образом:

<mvc:interceptors>
    <bean class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
        <property name="sessionFactory">
            <ref local="sessionFactory" />
        </property>
    </bean>
</mvc:interceptors>

при условии, что sessionFactory является ссылкой на ваш компонент SessionFactory.

Вам также необходимо включить пространство имен mvc.

xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
4 голосов
/ 14 февраля 2011

Попробуйте использовать <mvc:interceptors>.

Кстати, @Transactional - это совсем другое - ваши коллекции не работают в «представлении».Он просто открывает транзакцию (и сеанс) для аннотированного метода (и методов, которые он вызывает)

0 голосов
/ 14 февраля 2011

Если вы используете Struts2 с Spring и Hibernate, попробуйте использовать OpenSesisonInViewFilter и назначьте его в web.xml

...