|
|
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Привет всем, помагите плс с проблемой есть класс Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. усли я пишу 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 Как можно решить ... Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2012, 23:23:26 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 01:18:11 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, привет спасибо за ответ мда ... то есть если хочу загружать 2 колекции, не могу с 2 лефт жоин фитч плохо спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 11:05:48 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Blazkowiczгде-то видел подробное объяснение, почему их нельзя даже на SQL +1 МногоКоМногим нет в БД. Поэтому, либо проектировщик, либо Хибер - создают пром.таблицы чтобы упростить отношения до префикса Один_ко____. Это, в некотором роде, как множественное наследование - чрезмерно усложняет Модель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 11:08:22 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Petro123Blazkowiczгде-то видел подробное объяснение, почему их нельзя даже на SQL +1 МногоКоМногим нет в БД. Поэтому, либо проектировщик, либо Хибер - создают пром.таблицы чтобы упростить отношения до префикса Один_ко____. Это, в некотором роде, как множественное наследование - чрезмерно усложняет Модель. Это совсем другой вопрос. При JOINе сущности и двух коллекций, начинается путаница в fk_ и не всегда возможно точно определить какой именно fk_person кому принадлежит. Т.е. JOIN выдаёт результат, который можно трактовать по разному. К теме ManyToMany vs ManyToOne это отношения не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 11:18:54 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, ну тогда буду ждать рабочий пример сущности с 2-мя, 3-мя, N связями Много ко Много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 11:24:06 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
спасибо за ответ ест решение вопроса? потому-што загружать все колекции - думаю не целесообразно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 12:04:41 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
korsест решение вопроса? А какой вопрос? Почему нельзя заджоинить все коллекции одним запросом? Потому что путаница с ключами будет. Решение - не джоинить все коллекции одним запросом. korsпотому-што загружать все колекции - думаю не целесообразно Вы сами написали джоин чтобы загрузить все коллекции и думаете что это не целесообразно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 12:08:37 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
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... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 12:13:59 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, я пишу select person from Person person без join fetch i zagrujaiutsa vse 3 ... poluceaetsa ne mogu kontrolirovati s joinami - eto zagrujati, etu net thks ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 12:16:46 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
korsест решение вопроса? начать с модели и выявления сущностей-связей (чем меньше тем лучше) Одновременно смотреть структуру БД таблиц. Т.е. как делал ivanov_void - табличка, маппинг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 12:17:49 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Fetch Join на первую коллекцию. Она тогда загрузится в том же запросе что и Person ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 12:18:48 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, tolico odnu colectiu imeite v vidu i esli nujna drugoi list, zapuscaem eshcio raz s drugim join fetch thks ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 12:29:24 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 13:40:48 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Michael PonomarevНе уверен что поможет, но попробуй вместо List<> использовать Set<> Это, действительно, логично. Нет гарантированого порядка, не нужен List. new ArrayList() меня тоже немного смущает. Почему не Collections.emptyЧёНибудь()? Michael Ponomarevи делать left join fetch для только нужных коллекций ну вот если вдруг 2 коллекции нужны, то fetch join больше чем на одну нельзя. Michael PonomarevМне вроде бы помогало, но для случая @OneToMany AFAIK с OneToMany точно такая же ошибка будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 13:56:11 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Michael Ponomarevно для случая @OneToMany OneToMany - обычный FK на таблицу справочник ManyToMany - хибер генерит ещё одну таблицу в БД. Совершенно разные ситуации. Что у автора - х.з. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 14:18:43 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
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 - несколько коллекций внутри одной сущности) все работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 14:35:55 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Michael PonomarevOneToMany и ManyToOne да, ты прав, наоборот - обычный мастер-детайль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 14:49:11 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Petro123Michael PonomarevOneToMany и ManyToOne да, ты прав, наоборот - обычный мастер-детайль. OFFTOP я мастер-детайль со времен программирования на Delphi не слышал :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 14:51:31 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Michael Ponomarev, А вместо Вычисляемого поля - транзитное? ЗЫ Это бермудский треугольник ЯП.exe --- Net --- Java. Потеряться может всякий :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 14:54:36 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Michael PonomarevЯ о том и говорю, что если будет Set то можно написать столько left join fetch сколько надо Нашел свой код (с OneToMany - несколько коллекций внутри одной сущности) все работает На сколько я помню, наоборот, нужно в маппинг для List добавить index колонку, чтобы проблема ушла. А что Set, что List без индекса, в хибернейте выльются в Bag. В котором эта ошибка и происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 15:04:33 |
|
||
|
Hibernate, Lazy, HQL
|
|||
|---|---|---|---|
|
#18+
Michael Ponomarev тынц Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 15:56:02 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37717574&tid=2132246]: |
0ms |
get settings: |
22ms |
get forum list: |
24ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
61ms |
get topic data: |
21ms |
get forum data: |
5ms |
get page messages: |
89ms |
get tp. blocked users: |
2ms |
| others: | 453ms |
| total: | 691ms |

| 0 / 0 |
