Как правильно реализовать OpenSessionInView с Spring 3.0 и Hibernate 3 (в портлетах liferay)? - PullRequest
1 голос
/ 09 февраля 2010

У меня есть некоторые проблемы при реализации шаблона OpenSessionInView. Из различных ресурсов в Интернете я настроил свое приложение таким образом:
1) в моем dispatcher-servlet.xml у меня есть перехватчик, который должен получать все мои запросы с помощью весеннего класса OpenSessionInViewInterceptor:

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="interceptors">
         <list>
              <ref bean="openSessionInViewInterceptor"/>
         </list>
       </property>
        <property name="mappings">
            <props>
                <prop key="index.htm">indexController</prop>
            </props>
        </property>
    </bean>

    <bean name="openSessionInViewInterceptor"  class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
        <property name="sessionFactory">
            <ref bean="sessionFactoryAnnotation"/>
        </property>
    </bean>

2) затем я настроил транзакции на своем уровне обслуживания с помощью AOP следующим образом:

<aop:config>
        <aop:pointcut expression="execution(* it.jdk.crm.service..*Service.*(..))" id="gestioneComunicazioniOperation"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="gestioneComunicazioniOperation"/>
    </aop:config>

    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
<bean class="org.springframework.orm.hibernate3.HibernateTransactionManager" id="txManager">
        <property name="sessionFactory">
            <ref local="sessionFactoryAnnotation" />
        </property>
    </bean>
<bean class="org.springframework.orm.hibernate3.HibernateTransactionManager" id="txManager">
        <property name="sessionFactory">
            <ref local="sessionFactoryAnnotation" />
        </property>
    </bean>

Возможно ли, что две конфигурации находятся в конфликте? У меня есть требование, чтобы мой уровень Service (используемый в портлетах) был ограничен транзакциями, конфликтует ли он с OpenSessionInView? Если это так, то как я могу предотвратить ошибки LazyInitializationException в моих контроллерах?

EDIT: исключение происходит в представлении, когда я звоню

<c:forEach items="${communication.questions}" var="question" >

за исключением

ERROR [jsp:165] org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: it.*.Communication.questions, no session or session was closed

и код в контроллере, который вызывает представление, выглядит так:

@RequestMapping(params="action=dettagli")
    public ModelAndView dettagliComunicazione(@ModelAttribute("communication") Communication c) {
        Communication communication = null;
        try {
            communication = communicationService.findById(c.getId());
        } catch (Exception ex) {
        }
        Hashtable l = new Hashtable();
        l.put("communication", communication);
        return new ModelAndView("communication/details", l);

    }

, который разрешается в файле компонентом в dispatcher-servlet.xml:

<bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...