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 之 懶載入
- VS Could not evaluate expressionExpress
- 懶載入例項--hibernate
- 什麼是hibernate懶載入?什麼時候用懶載入?為什麼要用懶載入?(轉)
- Hibernate 基本操作、懶載入以及快取快取
- 懶載入
- hibernate懶載入導致多表聯合查詢失敗
- 懶載入和預載入
- iOS: 懶載入iOS
- 【譯】懶載入元件元件
- 圖片懶載入
- Vue元件懶載入Vue元件
- Ribbon - 懶載入
- vue路由懶載入Vue路由
- Vue 的懶載入Vue
- Swift中懶載入Swift
- spring 懶載入Spring
- Vue 路由按需載入(路由懶載入)Vue路由
- 前端效能優化 --- 懶載入&預載入前端優化
- 單張圖片懶載入
- 圖片懶載入(IntersectionObserver)Server
- vue(18)路由懶載入Vue路由
- 關於懶載入原理
- 懶載入之intersection observerServer
- 圖片懶載入原理
- Fragment 懶載入實踐Fragment
- 談談IntersectionObserver懶載入Server
- TabLayout+ViewPager 懶載入TabLayoutViewpager
- 不要濫用懶載入
- 手把手實現圖片懶載入+封裝vue懶載入元件封裝Vue元件
- 1道面試題---懶載入和預載入面試題
- 圖片懶載入踩坑
- 圖片懶載入大白話
- 圖片懶載入實現
- dva中元件的懶載入元件
- DCL懶載入單例模式單例模式
- tablayout+viewpager+fragment懶載入TabLayoutViewpagerFragment