Возможно ли использовать ленивую загрузку со многими ко многим в спящем режиме? - PullRequest
2 голосов
/ 13 октября 2011

Привет, у меня есть две сущности: Пользователь и Полномочия, они имеют отношение ко многим:

@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()));
    }

Я использую фабрику сеансов для управления своими транзакциями и @Transactional в методе dao.так есть какие-нибудь идеи или решения для этой проблемы?

1 Ответ

1 голос
/ 13 октября 2011

Да, это одно из самых распространенных исключений.Это означает, что ваш сеанс закрыт во время чтения вашей коллекции.

Решение состоит в том, чтобы иметь дополнительный сеанс.Или для инициализации коллекции перед закрытием сессии.

Кстати, не помещайте @Transactional в слой дао.В идеале это должно быть на уровне сервиса.

...