Hibernate 懒加载 Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.

avatar 2017年12月17日09:10:06 6 16341 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此

问题描述


这里有一个 角色表 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 配置文件里加如下代码
  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



最终成功解决



本文地址:https://liuyanzhao.com/6995.html
  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 编程爱好者交流群
  • 资源分享,问题解决,技术交流。QQ群:424285828(新群)
  • weinxin

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0