Метод Hibernate ManyToMany вызвал исключение «org.hibernate.LazyInitializationException»

У меня есть отношения ManyToMany в Hibernate

Проект.класс

@ManyToMany
@JoinTable(
        name = "user_projects",
        joinColumns = { @JoinColumn(name = "project_id")},
        inverseJoinColumns = { @JoinColumn(name = "user_id")}
)
private Set<User> projectUsers = new HashSet<>();

Пользователь.класс

@ManyToMany(fetch = FetchType.EAGER, 
            mappedBy = "projectUsers",
            cascade = CascadeType.ALL)
private Set<Project> userProjects = new HashSet<>();

И когда я получаю текущего пользователя через

@AuthenticationPrincipal User user

У меня метод вызвал исключение org.hibernate.LazyInitializationException, когда user.getUserProjects();

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
166
2

Ответы 2

Попробуйте использовать @Transactional, возможно, это можно решить, потому что аннотация @Transactional в методе getFavorites() указывает, что сеанс будет закрыт в конце этого метода

Это связано с тем, что при использовании @ManyToMany сначала извлекаются все Project пользователей, затем все User выбранных Project и так далее... Эта циклическая зависимость вызывает ошибку, потому что на стороне Project отсутствует нетерпеливая выборка.

Решением будет использование:

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
        name = "user_projects",
        joinColumns = { @JoinColumn(name = "project_id")},
        inverseJoinColumns = { @JoinColumn(name = "user_id")}
)
private Set<User> projectUsers = new HashSet<>();

Хотя я не рекомендую это решение из-за проблем с производительностью (и возможных побочных эффектов). Лучшим решением было бы иметь сущность для таблицы соединений.

Добавление @ManyToMany(fetch = FetchType.EAGER) не работает для меня (можете ли вы привести пример с сущностью для таблицы соединений, пожалуйста

Nikolai Neverov 25.02.2019 23:03

Другие вопросы по теме