在Spring Request Filter中加载对象时,Hibernate会话将关闭

时间:2017-03-24 22:28:51

标签: java spring hibernate

我有一个 AuthenticationFilter ,它从HTTP-Request读取一个令牌,从数据库加载用户对象并将其设置为 SecurityContextHolder

SecurityContextHolder.getContext().setAuthentication(resultOfAuthentication);

现在在控制器类的请求处理程序中,我想访问一个懒惰加载的User-object字段。问题是我得到 LazyInitializationException ,因为会话已关闭:

  

org.hibernate.LazyInitializationException:懒得初始化   一组角色:a.b.c.User.devices,可以   不初始化代理 - 没有会话

在请求完成之前,我如何才能保持会话开放?这样我可以懒惰地加载用户对象的字段?

1 个答案:

答案 0 :(得分:0)

您必须将该调用包含在@Transactional方法中,或者将事务边界移到调用层次结构中更高的位置,以便包含调用。

其他选择是:

  • 在会话仍处于打开状态时,急切地获取所有必需的依赖项(join fetch
  • 在事务上下文中使用Hibernate.initialize(user.getAddresses());
  • 只需在依赖性收集上调用尺寸方法即可初始化它们user.getAddresses().size