Hibernate 懒加载 Unable to evaluate the expression Method threw ‘org.hibernate.LazyInitializationExcept

时间:2024-03-24 10:38:12

问题描述

这里有一个 角色表 Role,用户表 User,权限表 Permission,角色和权限关系表 RolePermission

Role 实体类有五个属性

roleId,roleName,roleStatus (这三个是 Role 表的三个字段),

userList(一个角色对应多个用户,ManyToOne)

rolePermissionList(角色权限关系也是 ManyToOne的关系)

后面两个是根据外键关系创建的,不是数据表里的字段

 

现在在控制器 Debug 里打印数据

Hibernate 懒加载 Unable to evaluate the expression Method threw ‘org.hibernate.LazyInitializationExcept

 

如图 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.LazyInitializationExcept

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