Java 在Spring请求筛选器中加载对象时,Hibernate会话关闭

Java 在Spring请求筛选器中加载对象时,Hibernate会话关闭,java,spring,hibernate,Java,Spring,Hibernate,我有一个AuthenticationFilter,它从HTTP请求读取令牌,从数据库加载用户对象并将其设置为SecurityContextHolder: SecurityContextHolder.getContext().setAuthentication(resultOfAuthentication) 现在在控制器类中的请求处理程序中,我想访问延迟加载的用户对象的字段。问题是,由于会话已关闭,我得到了一个LazyInitializationException: org.hibernate.L

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

SecurityContextHolder.getContext().setAuthentication(resultOfAuthentication)

现在在控制器类中的请求处理程序中,我想访问延迟加载的用户对象的字段。问题是,由于会话已关闭,我得到了一个LazyInitializationException

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


有没有办法在请求完成之前保持会话打开?因此,我可以延迟加载用户对象的字段?

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

其他选择是:

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

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

其他选择是:

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

我可以用@Transactional注释AuthenticationFilter的doHandle(..)方法吗?AuthenticationFilter不是由Spring初始化的。我只是在我的Spring安全配置中初始化它。。这是一篇关于它的帖子。。这有用吗?我尝试在doHandle()方法上添加@transactional注释,但仍然存在相同的问题。我可以用@transactional注释AuthenticationFilter的doHandle(..)方法吗?AuthenticationFilter不是由Spring初始化的。我只是在我的Spring安全配置中初始化它。。这是一篇关于它的帖子。。这有用吗?我尝试在doHandle()上添加@transactional注释方法,但我仍然有相同的问题。您可以在web.xml openSession org.springframework.orm.hibernate3.support.OpenSessionInViewFilter openSession/*中配置它,您可以在web.xml openSession org.springframework.orm.hibernate3.support.OpenSessionInViewFilter openSession中配置它/*