1. 程式人生 > >Hibernate懶載入在SSH專案中的配置及原理

Hibernate懶載入在SSH專案中的配置及原理

Hibernate懶載入在SSH專案中
當使用懶載入的時候, 查找出來的物件中的資料如物件中的集合,它並沒有加載出來,只有當物件呼叫的時候才會向資料庫發出查詢語句, 這就會造成在hibernate中得到一個查詢出來的物件,當在action或者jsp頁面取裡面的資料, 這時候session已經關閉了,查詢請求當然就發不出去了,丟擲no session 異常

解決:
為了解決這個問題,配置一個 OpenSessionInViewFilter過濾器,它在struts2過濾器之前.並且需要在spring中配置好sessionFactory

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> ...

在web.xml中的配置

   <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name
>
contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext.xml</param-value> </context-param> <!-- 注意OpenSessionInViewFilter過濾器要配置在struts2過濾器之前 --> <filter> <filter-name>OpenSessionInViewFilter</filter-name
>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

它的執行原理就是在Struts2過濾器執行之前開啟session事物,在struts2執行完畢之後,關閉session, 那麼在struts2的整個響應過程共session的是存在的,隨時都可以向資料庫取資料.
但是session的存在時間延長,一級快取中的資料在記憶體中停留時間變長,佔用記憶體.