錯誤: 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