是否可以在休眠中使用多对多关系的延迟加载?

时间:2011-10-13 16:36:26

标签: hibernate many-to-many lazy-loading

嗨我有两个实体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。  对于这个问题有什么想法或解决方案吗?

1 个答案:

答案 0 :(得分:1)

是的,这是最常见的例外之一。这意味着您在尝试阅读集合时会话已关闭。

解决方案是选择会话。或者在会话关闭之前初始化集合。

顺便说一句,不要将@Transactional放在dao图层中。理想情况下,它应该在服务层上。