2013-07-31 4 views
3

Как использовать ленивую загрузку весной MVC? В данный момент я использую нетерпение, но это замедляет работу моего приложения. Это часть моего домена:Как использовать ленивую загрузку весной MVC

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "NEWS_TAG", joinColumns = @JoinColumn(name = "NEWS_ID"), inverseJoinColumns = @JoinColumn(name = "TAG_ID")) 
private List<Tags> tags = new ArrayList<Tags>(); 

public List<Tags> getTags() { 
    return this.tags; 
} 

И дао:

public List<News> getSomeNews(long b, long hm) { 

    List<News> news = (List<News>) sessionFactory 
      .getCurrentSession() 
      .createQuery(
        "from News WHERE title!='About' ORDER BY publish_time") 
      .setMaxResults((int) hm).setFirstResult((int) b).list(); 
    return news; 
} 

Servlet-контекст:

<context:annotation-config /> 

    <context:component-scan base-package="net.babobka.blog" /> 



    <import resource="../../db/db-config.xml" /> 

    <bean id="urlForwardController" 
     class="org.springframework.web.servlet.mvc.UrlFilenameViewController" /> 

    <bean id="tilesConfigurer" 
     class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
     <property name="definitions"> 
      <list> 
       <value>/WEB-INF/tiles.xml</value> 
      </list> 
     </property> 
    </bean> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass" 
      value="org.springframework.web.servlet.view.tiles2.TilesView" /> 
    </bean> 

</beans> 

Db-конфигурации:

<bean id="propertyConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
     p:location="/WEB-INF/db/jdbc.properties" /> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close" p:driverClassName="${jdbc.driverClassName}" 
     p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" /> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="configLocation"> 
      <value>/WEB-INF/db/hibernate.cfg.xml</value> 
     </property> 
     <property name="configurationClass"> 
      <value>org.hibernate.cfg.AnnotationConfiguration</value> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${jdbc.dialect}</prop> 
       <prop key="hibernate.show_sql">${jdbc.show_sql}</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <tx:annotation-driven /> 

</beans> 

web.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <!-- The definition of the Root Spring Container shared by all Servlets 
     and Filters --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 

     <param-value> 
     /WEB-INF/spring/root-context.xml 
     /WEB-INF/spring/application-security.xml 
     </param-value> 
    </context-param> 



    <!-- Creates the Spring Container shared by all Servlets and Filters --> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 



    <!-- Processes application requests --> 
    <servlet> 
     <servlet-name>appServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>appServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <servlet-mapping> 
     <servlet-name>appServlet</servlet-name> 
     <url-pattern>*.gif</url-pattern> 
    </servlet-mapping> 
    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter> 
     <filter-name>hibernateFilterChain</filter-name> 
     <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>hibernateFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 




</web-app> 

Что мне нужно для решения моей проблемы?

ответ

5

Вы можете использовать OpenSessionInViewFilter для предотвращения закрытия сеанса спящего режима. Добавьте к этому web.xml:

<filter> 
    <filter-name>hibernateFilterChain</filter-name> 
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>hibernateFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 

@see подробнее здесь: OpenSessionInViewFilter

И удалить fetch = FetchType.EAGER. @ManyToMany LAZY по умолчанию.

+0

Определен bean с именем «sessionFactory» – babobka

+0

@ user2639377: Если вы используете управляемый объект JPA, вам нужно заменить 'filter-class' на' org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter'. Предоставьте конфигурацию вашего весеннего контекста. –

+0

Уже в теме – babobka

1

Изменение аннотации на (fetch = FetchType.LAZY). Имейте в виду, что если вы передаете результат в какой-то код вне транзакции (например, шаблон представления), вы можете столкнуться с ошибками, если связанные объекты, необходимые для внешнего кода, еще не были загружены.

+0

№ С добавлением FetchType.LAZY только у меня будут некоторые ошибки с сеансом или что-то в этом роде. – babobka

+0

Ваш комментарий не ясен. Вы говорите, что если вы перейдете на LAZY, вы начнете получать ошибки? Являются ли эти ошибки результатом попыток доступа к выгруженным связанным объектам после того, как вы покинули транзакцию? – chrylis

+0

У меня есть это: не удалось лениво инициализировать коллекцию роли: net.babobka.blog.domain.News.tags, сеанс или сеанс не закрыты – babobka

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