powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate tree structure + join fetch
8 сообщений из 8, страница 1 из 1
Hibernate tree structure + join fetch
    #39264970
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть класс:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class Tree {

@ManyToOne
protected Tree parent;

@OneToMany
protected Set<Tree> childs;

protected Set<SomeOtherObject> objects;
}



Даже если сделать "...join fetch objects...", то при обращении к ним через getParent()/getChilds() вылетает LazyInitializationException. Как это решить?
...
Рейтинг: 0 / 0
Hibernate tree structure + join fetch
    #39264976
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает с FetchType.EAGER, но не хотелось бы.
...
Рейтинг: 0 / 0
Hibernate tree structure + join fetch
    #39265140
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Работает с FetchType.EAGER, но не хотелось бы.

YouTube Video
...
Рейтинг: 0 / 0
Hibernate tree structure + join fetch
    #39265159
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892,

Я уже десяток раз объяснял, вы бы хоть поиском посмотрели.
Вариантов несколько.

- Самый правильный это динамически управлять Fetch для каждого конкретного случая, чтобы загружать только те ассоциации, которые вам нужны в конкретном сценарии.
Для этого есть FetchMode в Criteria API, fetch в HQL и теперь даже Fetch Profiles, ещё не пользовал, но, похоже, очень полезная штука.

- Вариант попроще, держать сессию открытой, расширяя область действия транзакции и сессии. Называется Open Session In View. Имеет ряд недостатков.

- Ну, и самый корявый вариант в лоб, эдакий FetchMode для бедных - насильно прогрузить зависимости, например, через HibernateUtils, но до того как закроется сессия.
...
Рейтинг: 0 / 0
Hibernate tree structure + join fetch
    #39265162
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Даже если сделать "...join fetch objects...", то при обращении к ним через getParent()/getChilds() вылетает LazyInitializationException. Как это решить?
Интересно, а что вас удивляет, то что fetch objects по какой-то странной причине выбирает только objects, но не выбирает другие зависимости??
Кстати, а getParent() по умолчанию не должен быть ленивым, это же обычное свойство. Его нужно обязательно проксировать для ленивости.
...
Рейтинг: 0 / 0
Hibernate tree structure + join fetch
    #39265163
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Есть класс:
Ещё хочется отметить что такой банальный способ хранения деревьев в реляционной БД далеко не самый удобный. Есть другие способы оптимизированные под разные задачи.
...
Рейтинг: 0 / 0
Hibernate tree structure + join fetch
    #39265230
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, наверное, не до конца написал в чем проблема.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//сервис @Transactional:
public List<Tree> getAll() {
...
result = em.createQuery("from Tree tr join fetch tr.childs join fetch tr.objects")
return resul;
}

затем вне транзакции:

List<Tree> treeList = service.getAll()
treeList.get(0).getObjects() //OK
treeList.get(0).getChilds().get(0).getObjects() //LazyInitializationException ...



Как написать join fetch рекурсивно? Типо join fetch tr.childs.objects tr2 join fetch tr.childs.childs.objects )) и т.д.

По структуре - базу менять нельзя.
...
Рейтинг: 0 / 0
Hibernate tree structure + join fetch
    #39265245
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892,

Тогда есть такие варианты.
- Написать HQL с fetch до определенного уровня. Для глубокого дерева будет уродливо.
- Инициализировать рекурсивно в коде. Правда, в этом случае будет много запросов, а не толстый JOIN
- Выгрести все нужные ноды с fetch на детей, а потом уже построить дерево по выборке.
- Но! По-моему именно здесь должен подойти как нельзя кстати Fetch Profile. Если вы утверждаете что FetchType.EAGER решает проблему (точно ли?), то можно его активировать для нужной сессии перед выборкой.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate tree structure + join fetch
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]