当对象加载到 Spring 请求过滤器中时,休眠会话将关闭



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

SecurityContextHolder.getContext().setAuthentication(resultOfAuthentication);

现在在控制器类的请求处理程序中,我想访问延迟加载的用户对象的字段。问题是我收到一个延迟初始化异常,因为会话已关闭:

org.hibernate.LazyInitializationException: 未能延迟初始化 角色的集合:a.b.c.User.devices,可以 不初始化代理 - 无会话

任何想法如何使会话保持打开状态,直到请求完成?这样我就可以懒惰地加载用户对象的字段?

您必须

将该调用包含在 @Transactional 方法中,或者在调用层次结构中向上移动事务边界,以便也包含调用。

其他选择是:

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

最新更新