powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate, Lazy, HQL
23 сообщений из 23, страница 1 из 1
Hibernate, Lazy, HQL
    #37716954
kors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем,
помагите плс с проблемой
есть класс
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 private Long personId;
    
    private String username;
    
    private String name;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "personposition", joinColumns = @JoinColumn(name="personId"), inverseJoinColumns = @JoinColumn(name = "positionId"))
    private List<Position> positions = new ArrayList<Position>();

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "subordinatesuperior", joinColumns = @JoinColumn(name="subordinateId"), inverseJoinColumns = @JoinColumn(name = "superiorId"))
    private List<Person> superiorPersons = new ArrayList<Person>();

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "subordinatesuperior", joinColumns = @JoinColumn(name="superiorId"), inverseJoinColumns = @JoinColumn(name = "subordinateId"))
    private List<Person> subordinatePersons = new ArrayList<Person>();



усли я пишу select person from Person person то я получаю все колекции(positions, superiorPersons, superiorPersons ) c данными.

Я хочу к примеру только первые две колекции и пишу так
select person from Person left join fetch person.position
left join fetch person.superiorPersons where person.personId = 1
но получаю
org.springframework.orm.hibernate3.HibernateSystemException: cannot simultaneously fetch multiple bags; nested exception is org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

Как можно решить ...
Спасибо
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717040
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korsусли я пишу select person from Person person то я получаю все колекции(positions, superiorPersons, superiorPersons ) c данными.

Коллекции догружаются лениво дополнительными SELECT запросами.

korsorg.springframework.orm.hibernate3.HibernateSystemException: cannot simultaneously fetch multiple bags; nested exception is org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

Можно уменьшить количество запросов с помощью FETCH JOIN, но нельзя сделать Join в котором одновременно несколько ManyToMany коллекций, где-то видел подробное объяснение, почему их нельзя даже на SQL JOIN корректно выбрать. Хибер теряется в большом количестве строк и не может из них правильно идентифицировать объекты.
Используйте Criteria API и FetchMode.SELECT
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717400
kors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

привет
спасибо за ответ
мда ...
то есть если хочу загружать 2 колекции, не могу с 2 лефт жоин фитч
плохо
спасибо
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717409
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczгде-то видел подробное объяснение, почему их нельзя даже на SQL
+1
МногоКоМногим нет в БД. Поэтому, либо проектировщик, либо Хибер - создают пром.таблицы чтобы упростить отношения до префикса Один_ко____.
Это, в некотором роде, как множественное наследование - чрезмерно усложняет Модель.
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717440
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Blazkowiczгде-то видел подробное объяснение, почему их нельзя даже на SQL
+1
МногоКоМногим нет в БД. Поэтому, либо проектировщик, либо Хибер - создают пром.таблицы чтобы упростить отношения до префикса Один_ко____.
Это, в некотором роде, как множественное наследование - чрезмерно усложняет Модель.
Это совсем другой вопрос.
При JOINе сущности и двух коллекций, начинается путаница в fk_ и не всегда возможно точно определить какой именно fk_person кому принадлежит. Т.е. JOIN выдаёт результат, который можно трактовать по разному.
К теме ManyToMany vs ManyToOne это отношения не имеет.
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717453
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
ну тогда буду ждать рабочий пример сущности с 2-мя, 3-мя, N связями Много ко Много.
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717559
kors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо за ответ
ест решение вопроса?
потому-што загружать все колекции - думаю не целесообразно
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717574
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korsест решение вопроса?

А какой вопрос? Почему нельзя заджоинить все коллекции одним запросом? Потому что путаница с ключами будет.
Решение - не джоинить все коллекции одним запросом.

korsпотому-што загружать все колекции - думаю не целесообразно
Вы сами написали джоин чтобы загрузить все коллекции и думаете что это не целесообразно?
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717582
kors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kors,

я вижу в консоле

Hibernate: select subordinat0_.superiorId as superiorId5_1_, subordinat0_.subord
inateId as subordin1_1_, person1_.personId as personId5_0_, person1_.name as nam
e5_0_, person1_.username as username5_0_ from subordinatesuperior subordinat0_ i
nner join person person1_ on subordinat0_.subordinateId=person1_.personId where
subordinat0_.superiorId=?
Hibernate: select person0_.personId as personId5_, person0_.name as name5_, pers
on0_.username as username5_ from person person0_ where person0_.personId=? limit
?

Hibernate: select superiorpe0_.subordinateId as subordin1_5_1_, superiorpe0_.sup
eriorId as superiorId1_, person1_.personId as personId5_0_, person1_.name as nam
e5_0_, person1_.username as username5_0_ from subordinatesuperior superiorpe0_ i
nner join person person1_ on superiorpe0_.superiorId=person1_.personId where sup
eriorpe0_.subordinateId=?
Hibernate: select person0_.personId as personId5_, person0_.name as name5_, pers
on0_.username as username5_ from person person0_ where person0_.personId=? limit
?

Hibernate: select positions0_.personId as personId5_1_, positions0_.positionId a
s positionId1_, position1_.positionId as positionId6_0_, position1_.coordinator
as coordina2_6_0_, position1_.name as name6_0_, position1_.parentId as parentId6
_0_, position1_.type as type6_0_ from personposition positions0_ inner join posi
tion position1_ on positions0_.positionId=position1_.positionId where positions0
_.personId=?
Hibernate: select person0_.personId as personId5_, person0_.name as name5_, pers
on0_.username as username5_ from person person0_ where person0_.personId=? limit
?

3 блока для 3 коллекции ...
но хочу к примеру 2...
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717598
kors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
я пишу select person from Person person
без join fetch i zagrujaiutsa vse 3 ...
poluceaetsa ne mogu kontrolirovati s joinami - eto zagrujati, etu net

thks
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717607
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korsест решение вопроса?
начать с модели и выявления сущностей-связей (чем меньше тем лучше)
Одновременно смотреть структуру БД таблиц.
Т.е. как делал ivanov_void
- табличка, маппинг
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717609
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fetch Join на первую коллекцию. Она тогда загрузится в том же запросе что и Person
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717626
kors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

tolico odnu colectiu imeite v vidu

i esli nujna drugoi list, zapuscaem eshcio raz s drugim join fetch

thks
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717803
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korsПривет всем,
помагите плс с проблемой
есть класс

усли я пишу select person from Person person то я получаю все колекции(positions, superiorPersons, superiorPersons ) c данными.

Я хочу к примеру только первые две колекции и пишу так
select person from Person left join fetch person.position
left join fetch person.superiorPersons where person.personId = 1
но получаю
org.springframework.orm.hibernate3.HibernateSystemException: cannot simultaneously fetch multiple bags; nested exception is org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

Как можно решить ...
Спасибо
Не уверен что поможет, но попробуй вместо List<> использовать Set<> и делать left join fetch для только нужных коллекций
Мне вроде бы помогало, но для случая @OneToMany
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717848
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael PonomarevНе уверен что поможет, но попробуй вместо List<> использовать Set<>

Это, действительно, логично. Нет гарантированого порядка, не нужен List.
new ArrayList() меня тоже немного смущает. Почему не Collections.emptyЧёНибудь()?

Michael Ponomarevи делать left join fetch для только нужных коллекций

ну вот если вдруг 2 коллекции нужны, то fetch join больше чем на одну нельзя.


Michael PonomarevМне вроде бы помогало, но для случая @OneToMany
AFAIK с OneToMany точно такая же ошибка будет.
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717905
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Ponomarevно для случая @OneToMany
OneToMany - обычный FK на таблицу справочник
ManyToMany - хибер генерит ещё одну таблицу в БД.
Совершенно разные ситуации.
Что у автора - х.з.
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717961
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Michael Ponomarevно для случая @OneToMany
OneToMany - обычный FK на таблицу справочник
ManyToMany - хибер генерит ещё одну таблицу в БД.
Совершенно разные ситуации.
Что у автора - х.з.
Судя по тому что ты написал, ты перепутал OneToMany и ManyToOne
Ситуации хотя и действительно разные, ошибка похожая.

BlazkowiczMichael PonomarevНе уверен что поможет, но попробуй вместо List<> использовать Set<>

Michael Ponomarevи делать left join fetch для только нужных коллекций

ну вот если вдруг 2 коллекции нужны, то fetch join больше чем на одну нельзя.
Michael PonomarevМне вроде бы помогало, но для случая @OneToMany
AFAIK с OneToMany точно такая же ошибка будет.
Я о том и говорю, что если будет Set то можно написать столько left join fetch сколько надо
Нашел свой код (с OneToMany - несколько коллекций внутри одной сущности) все работает
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37717995
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael PonomarevOneToMany и ManyToOne
да, ты прав, наоборот - обычный мастер-детайль.
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37718002
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Michael PonomarevOneToMany и ManyToOne
да, ты прав, наоборот - обычный мастер-детайль.
OFFTOP я мастер-детайль со времен программирования на Delphi не слышал :)
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37718015
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Ponomarev,

А вместо Вычисляемого поля - транзитное?
ЗЫ
Это бермудский треугольник ЯП.exe --- Net --- Java.
Потеряться может всякий :)
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37718029
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael PonomarevЯ о том и говорю, что если будет Set то можно написать столько left join fetch сколько надо
Нашел свой код (с OneToMany - несколько коллекций внутри одной сущности) все работает
На сколько я помню, наоборот, нужно в маппинг для List добавить index колонку, чтобы проблема ушла.
А что Set, что List без индекса, в хибернейте выльются в Bag. В котором эта ошибка и происходит.
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37718120
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

тынц
...
Рейтинг: 0 / 0
Hibernate, Lazy, HQL
    #37718149
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Ponomarev тынц
Спасибо.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate, Lazy, HQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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