Hibernate 懶載入 Unable to evaluate the expression Method threw ‘org.hibernate.LazyInitializationExcept

言曌發表於2018-04-02

問題描述

這裡有一個 角色表 Role,使用者表 User,許可權表 Permission,角色和許可權關係表 RolePermission

Role 實體類有五個屬性

roleId,roleName,roleStatus (這三個是 Role 表的三個欄位),

userList(一個角色對應多個使用者,ManyToOne)

rolePermissionList(角色許可權關係也是 ManyToOne的關係)

後面兩個是根據外來鍵關係建立的,不是資料表裡的欄位

 

現在在控制器 Debug 裡列印資料

Hibernate 懶載入 Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.

 

如圖 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 配置檔案里加如下程式碼

  1. <mvc:interceptors>
  2.     <bean class="org.springframework.orm.hibernate4.support.">
  3.          <property name="sessionFactory" ref="sessionFactory"/>
  4.     </bean>
  5. </mvc:interceptors>

 

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

 

最終成功解決

Hibernate 懶載入 Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.

本文地址:https://liuyanzhao.com/6995.html

相關文章