我有一个 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
: