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