Hibernate: не удалось лениво инициализировать коллекцию

1

У меня есть два объекта: User и Module, которые связаны с многими из многих.

в моем объекте пользователя у меня есть член списка модулей:

Изображение 174551

Я вставляю нового пользователя успешно, но когда я хочу получить пользователей, я получаю информацию о пользователях, но я не получаю модули пользователя. и я получаю это сообщение об ошибке:

.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию роли: ma.propar.FireApp.Entites.Utilisateur.modules, не удалось инициализировать прокси - нет сеанса

  • 0
    Пожалуйста, вставьте фрагмент кода!
Теги:
hibernate
many-to-many
jpa
lazy-loading

2 ответа

1
Лучший ответ

Список user.modules @ManyToMany по умолчанию LAZY, поэтому, когда вы выбираете users вы получаете user.modules прокси user.modules.

Если Session Hibernate закрыт, вы не сможете получить доступ к неинициализированным прокси, не получая LazyInitializationException.

Для извлечения модулей в одном и том же запросе HQL вам нужно использовать "fetch":

select u from Utilisateur u left join fetch u.modules

Хотя вы можете установить связь с FetchType.EAGER чтобы вы всегда извлекали модули вдоль пользователей

@ManyToMany(fetch=FetchType.EAGER)

вы не должны использовать EAGER, потому что это плохо для производительности.

  • 0
    Что если я хочу сохранить тип выборки как активный и сохранить данные в таблице PRIVILEGES при создании пользователя, у меня уже есть модули в базе данных.
0

Чтобы ответить на ответ Влада, с аннотациями вы можете реализовать выборку с помощью

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
@ManyToMany(cascade = CascadeType.ALL,fetch=FetchType.EAGER)
@Fetch(FetchMode.SELECT)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню