【问题标题】:Hibernate session is closed when object is loaded in Spring Request Filter在 Spring 请求过滤器中加载对象时,休眠会话关闭
【发布时间】:2017-03-26 19:59:13
【问题描述】:

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

SecurityContextHolder.getContext().setAuthentication(resultOfAuthentication);

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

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

任何想法如何在请求完成之前保持会话打开?这样我就可以延迟加载 User-Object 的字段了吗?

【问题讨论】:

  • 可以在web.xml中配置 openSessionorg.springframework.orm.hibernate3.support.OpenSessionInViewFilter-class> openSession/*

标签: java spring hibernate


【解决方案1】:

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

其他选择是:

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

【讨论】:

  • 我可以用 @Transactional 注释我的 AuthenticationFilterdoHandle(..) 方法吗? AuthenticationFilter 没有被 Spring 初始化。我只是在我的 Spring Security 配置中初始化它。
  • 是的,你可以.. 这是一篇关于它的帖子.. stackoverflow.com/questions/6278783/…
  • 这行得通吗?我尝试在 doHandle() 方法上添加@transactional 注释,但我仍然遇到同样的问题。
猜你喜欢
  • 2013-07-26
  • 1970-01-01
  • 2012-03-10
  • 2017-05-26
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多