延迟初始化:未能延迟初始化集合
Posted
技术标签:
【中文标题】延迟初始化:未能延迟初始化集合【英文标题】:Lazily initialization : failed to lazily initialize a collection 【发布时间】:2020-05-10 14:18:24 【问题描述】: org.hibernate.LazyInitializationException:未能延迟初始化角色集合:in.aajubaaju.model.User.roles,无法初始化代理 - 无会话 在 org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:602) 在 org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:217) 在 org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:581) 在 org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:148) 在 org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:188) 在 in.aajubaaju.security.service.UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:41) 在 in.aajubaaju.jwt.UserAuthenticationFilter.doFilterInternal(UserAuthenticationFilter.java:36) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:74) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 in.aajubaaju.config.CorsConfig.doFilter(CorsConfig.java:48) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(未知来源)这里是实体类部分
@ElementCollection
@CollectionTable(name = "user_roles_table",
joinColumns = @JoinColumn(name = "user_id_fk", referencedColumnName = "user_id")
)
@Column(name = "role_name")
private Set<String> roles = new HashSet<String>();
我正在尝试从这里获得角色
@Service
public class UserDetailsServiceImpl implements UserDetailsService
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
User user = null;
if (StringUtils.isNotBlank(username))
Set<GrantedAuthority> authorities = new HashSet<>();
user = userRepository.findByUsernameIgnoreCase(username);
if (user == null)
throw new UsernameNotFoundException("UserName Not Found " + username);
for (String role : user.getRoles() )
authorities.add(new SimpleGrantedAuthority(role));
String sessionId = getSessionId();
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest req = attr.getRequest();
HttpSession session = req.getSession();
session.setAttribute(ApplicationConstants.SESSION_ID, sessionId);
session.setAttribute(ApplicationConstants.USER_ID, username);
return new UserPrinciple(user.getId(), user.getUsername(), user.getPassword(), authorities);
return null;
private static String getSessionId()
return RandomStringUtils.randomAlphanumeric(13);
【问题讨论】:
【参考方案1】:尝试在方法loadUserByUsername
中使用来自spring的注解@Transactional
。
请参阅 Spring 文档中的 Transaction Management。
【讨论】:
以上是关于延迟初始化:未能延迟初始化集合的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate:未能延迟初始化角色集合,没有会话或会话被关闭
Hibernate org.hibernate.LazyInitializationException:未能延迟初始化角色集合:
未能延迟初始化角色集合:无法初始化代理 - Hibernate 中的 @ManyToMany 映射注释中没有会话错误? [复制]
未能延迟初始化角色集合:com.pojo.Student.phonenos,没有会话或会话已关闭