Hibernate 懶加載 錯誤----no session


錯誤: unable to evaluate the expression Method threw 'org.hibernate.LazyInitializa

   org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: XXXX, could not initialize proxy - no Session
原因:Hibernate延遲加載策略, 也就是用到的時候才去加載.這樣可以提高一些性能.
Hibernate的lazy loading 采用了一個HibernateSession來管理session,它的邏輯是每進行一次數據庫操作,就開新的session,操作完成后立即關閉該session。這樣做的好處是可以嚴格關閉session,避免菜鳥級的錯誤,但是並不推薦這么做。因為這不適合lazy loading,也不適合跨方法的事務。

  比如在我們的應用中,user->post形成一對多的映射,User中有一個包含post的List。
在User中,有多個屬性:name,password,phone等,還有一個List類型的posts。當我們對posts使用lazy laoding的時候,hibernate會在獲得User對象的時候,僅僅返回name,password,phone等基本屬性,當你訪問posts的時候,它才會從數據庫中提取posts需要的數據,這就是所謂lazy laoding。但是在我們的系統中,session是被立即關閉的,也就是在讀取了name,password,phone等基本屬性后,session已經close了,再進行lazy loaiding就會有異常。

解決辦法:使用OpenSessionInViewInterceptor攔截器

  1.在springmvc 配置文件中添加攔截器配置

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

 

 

 

  2.或者在web.xml中配置filter

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM