java - 当 Spring 请求过滤器中加载对象时,Hibernate session 将关闭

标签 java spring hibernate

我有一个AuthenticationFilter,它从 HTTP 请求中读取 token ,从数据库加载用户对象并将其设置为 SecurityContextHolder:

SecurityContextHolder.getContext().setAuthentication(resultOfAuthentication);

现在,在 Controller 类的请求处理程序中,我想访问延迟加载的用户对象的字段。问题是我收到 LazyInitializationException 因为 session 已关闭:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: a.b.c.User.devices, could not initialize proxy - no Session

有什么想法可以让 session 保持打开状态直到请求完成吗?这样我就可以延迟加载用户对象的字段?

最佳答案

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

其他选项是:

  • 在 session 仍处于打开状态时立即获取所有必需的依赖项(join fetch)
  • 在事务上下文中使用 Hibernate.initialize(user.getAddresses());
  • 只需调用依赖集合上的 size 方法来初始化它们user.getAddresses().size:

关于java - 当 Spring 请求过滤器中加载对象时,Hibernate session 将关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43010147/

相关文章:

java - 构建的 JAR 的代码覆盖率

spring - 如何运行独立/交互式 Spring Boot CRaSH Shell 应用程序?

spring - jBPM 与 Spring 和 Hibernate 集成的示例项目

java - 错误如下所述

java - 如何在 h :selectOneMenu? 中更改值时在 ajax 请求中传递附加参数

java - 想要在java中制作一个像每个用户一个许可证的应用程序

spring - 为什么我们不能在 spring 中 Autowiring 静态字段?

java - Spring Boot - hibernate - 表不存在

java - 正则表达式查找不匹配的字符串中的整数

java - 如何调用Spring Security Provider?