嗨我有两个实体User和Authority 他们有很多关系:
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "authority_id") })
private List<Authority> authorities = new ArrayList<Authority>(0);
当我使用FetchType.LAZY
并尝试获取用户权限时,我得到例外:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role
这是我如何获得用户对象:
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
User user = userDao.findUserByEmail(username);
if (user == null)
throw new UsernameNotFoundException("No user with username '"
+ username + "' found!");
return new org.springframework.security.core.userdetails.User(
user.getEmail(), user.getPassword(), true, true, true, true,
setUserAuthorities(user.getAuthorities()));
}
我正在使用会话工厂来管理我的交易,并使用dao方法@Transactional
。
对于这个问题有什么想法或解决方案吗?
答案 0 :(得分:1)
是的,这是最常见的例外之一。这意味着您在尝试阅读集合时会话已关闭。
解决方案是选择会话。或者在会话关闭之前初始化集合。
顺便说一句,不要将@Transactional
放在dao图层中。理想情况下,它应该在服务层上。