Hibernate 懶載入 Unable to evaluate the expression Method threw ‘org.hibernate.LazyInitializationExcept
問題描述
這裡有一個 角色表 Role,使用者表 User,許可權表 Permission,角色和許可權關係表 RolePermission
Role 實體類有五個屬性
roleId,roleName,roleStatus (這三個是 Role 表的三個欄位),
userList(一個角色對應多個使用者,ManyToOne)
rolePermissionList(角色許可權關係也是 ManyToOne的關係)
後面兩個是根據外來鍵關係建立的,不是資料表裡的欄位
現在在控制器 Debug 裡列印資料
如圖 Role 表的三個欄位有內容,而外來鍵的關係的欄位是沒有內容的。
原因
Hibernate延遲載入策略, 也就是用到的時候才去載入.這樣可以提高一些效能.
Hibernate的lazy loading 採用了一個HibernateSession來管理session,它的邏輯是每進行一次資料庫操作,就開新的session,操作完成後立即關閉該session。這樣做的好處是可以嚴格關閉session,避免菜鳥級的錯誤,但是並不推薦這麼做。因為這不適合lazy loading,也不適合跨方法的事務。
比如在我們的應用中,user->article 形成一對多的對映,User 中有一個包含 article 的List。
在User中,有多個屬性:name,password,phone等,還有一個 List 型別的 articleList。當我們對 article 使用 lazy laoding 的時候,hibernate會在獲得 User 物件的時候,僅僅返回 name,password,phone 等基本屬性,當你訪問 articleList 的時候,它才會從資料庫中提取 articleList 需要的資料,這就是所謂lazy laoding。但是在我們的系統中,session是被立即關閉的,也就是在讀取了name,password,phone等基本屬性後,session 已經 close了,再進行 lazy loaiding 就會有異常。
解決辦法
1、使用OpenSessionInViewInterceptor攔截器
在 mvc 配置檔案里加如下程式碼
- <mvc:interceptors>
- <bean class="org.springframework.orm.hibernate4.support.">
- <property name="sessionFactory" ref="sessionFactory"/>
- </bean>
- </mvc:interceptors>
2.或者在web.xml中配置filter
最終成功解決
相關文章
- Hibernate 之 懶載入
- Hibernate 基本操作、懶載入以及快取快取
- 懶載入
- 懶載入和預載入
- Ribbon - 懶載入
- Vue元件懶載入Vue元件
- 【譯】懶載入元件元件
- 圖片懶載入
- vue路由懶載入Vue路由
- Vue 的懶載入Vue
- 圖片預載入和懶載入
- Vue 路由按需載入(路由懶載入)Vue路由
- 前端效能優化 --- 懶載入&預載入前端優化
- 懶載入之intersection observerServer
- 圖片懶載入原理
- vue(18)路由懶載入Vue路由
- 圖片懶載入(IntersectionObserver)Server
- 關於懶載入原理
- Fragment 懶載入實踐Fragment
- 手把手實現圖片懶載入+封裝vue懶載入元件封裝Vue元件
- [譯] React 16.6 懶載入(與預載入)元件React元件
- 單張圖片懶載入
- 圖片懶載入實現
- DCL懶載入單例模式單例模式
- 圖片懶載入踩坑
- 圖片懶載入大白話
- dva中元件的懶載入元件
- Android優化--Fragment懶載入Android優化Fragment
- Js圖片懶載入(lazyload)JS
- Laravel Eloquent中的 懶載入VS即時載入Laravel
- 頁面圖片預載入與懶載入策略
- VIM Lazy Load 懶載入/延遲載入技術
- 滾動載入圖片(懶載入)實現原理
- 1道面試題---懶載入和預載入面試題
- Vue 非同步元件&路由懶載入Vue非同步元件路由
- webpack懶載入程式碼原理深究Web
- 圖片懶載入js實現JS
- vue-cli懶載入問題Vue