|
|
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
Коллеги, Есть непонятка с Hibernate 5.1. Он делает SELECT вместо JOIN при маппинге одной Entity дваждый из разных child'ов. Вообщем задача такая: Есть мероприятие\конференция которая содержит коллекцию спикеров-хедлайнеров и коллекция докладов. Каждый спикер-хедлайнер маппится OneToOne к сущности UserEntity которая содержит всякие там детали (ФИО, соц. сети и прочее) Каждый доклад так же маппится на SpeakerEntity а он соответственно так же на UserEntity. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. Собственно проблема в том, что hibernate делает такой вот SELECT Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. А потом еще до SELECT'ивает. Чего я собственно не хочу . А хочу чтобы все JOIN'илось Код: sql 1. 2. 3. Как мне заставить hibernate сущность UserEntity джоинить, а не доселективать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 01:26 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
Мне недавно нужно было победить схожую проблему. Для меня проще всего было написать HQL запрос с явным "join fetch" примерно from SpeakerEntity speaker join fetch speaker.user ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 10:27 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
лол. я бился с таким косяком. причем он там такие аномалии вываливал в п зависимости от некоторых обстоятельств, мало связанных с состоянием базы что волосы дыбом на спине вставали. в общем, убрал фетч.тайп.игер у всех коллекций на лейзи - и всё пришло в адекват. я понял что при игер хибер может начинать доставать заджоиные сущности не всегда так, как самое простое, а какими то запутанными неведомыми путями. да и вообще, делая игер на коллекциях ты рискуешь вытащив одну сущность случайно вытащить всю базу в память. имхо не очень хорошее решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 11:22 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
andreykaT, Тут на самом деле - это не проблема в fetch type. Так как fetch влияет на то когда будут получены данные, а не сколькими запросами. В случае автора данные вытягиваются при первом получении конревого объекта, но в n+1 запросов. К стати по умолчанию OneToOne имеет fetch = FetchType.EAGER (в JPA спеке точно). Вот тут подробно ответили http://stackoverflow.com/questions/1002547/onetoone-relationship-with-shared-primary-key-generates-n1-selects-any-workaro/3538465#3538465 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 12:29 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
Mad_Head, я про мени ту ван. ван ту мени тоже по умолчанию игер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 13:53 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
в смысле, наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 13:54 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
Mad_Head, Ну так в этом и проблема :) OneToOne я хочу именно EAGER и именно JOIN'ом. У меня же по факту EAGER случается, но SELECT'ом. А в статье указано на сколько я понял именно как заставить OneToOne работать в режиме LAZY. А мне этого не надо :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 18:49 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
Вроде по умолчанию нельзя настроить выборку с несколькими джойнами в одном бине ?! или в новой версии уже можно ? т.е. только одна коллекция может быть джоин безууказания лайзи? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. такая штука вообще без @Fetch(FetchMode.JOIN) работать не будет ! вроде как ?! плюс нужно смотреть конфигурацию - возоожно вы указали нбеольшую глубину подзапросов и поэтому хибер добирает селектами ? пробегитесь по вашим пропертям итд : Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 10:02 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
Atum1Вроде по умолчанию нельзя настроить выборку с несколькими джойнами в одном бине ?! или в новой версии уже можно ? т.е. только одна коллекция может быть джоин безууказания лайзи? Не знаю что для вас значит новая или старая, но 4ом хибере можно было в одном бине делать джойны нескольких child'ов. И они доставались из базы норм. В 3ем не помню уже :( Atum1плюс нужно смотреть конфигурацию - возоожно вы указали нбеольшую глубину подзапросов и поэтому хибер добирает селектами ? пробегитесь по вашим пропертям итд : Код: java 1. 2. 3. Да мне это первое что в голову так же пришло. Но к сожалению это не помогло. max_fetch_depth = 4, увеличение даже до 10 не даёт ожидаемого результата. default_batch_fetch_size и fetch_size ИМХО из другой оперы :) Хибер доберает селектами потому что я два раза выбираю сущность UserEntity по одному и тому же полю(primary key). Хибер думает что он первым джойном выбирает UserEntity поэтому и не включает его в join при запросе из базы. А когда получает корневую сущность до хибера доходит, что он выбрал не всё :) и начинает до заполнять объекты UserEntity. Просто я думаю, что стопудоф есть какая то настроечка для этого, но какая вообще найти не могу. Даже загуглить не знаю как :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 20:04 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
JPQL HQL или JPA Criteria API через них ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 10:14 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
TepKuH, Есть у меня подозрение на одно ограничение. Точно не вспомню. Но раньше насильное желание всё заджоинить приводило к исключению. Может в последних версиях исключение заменили на насильственный SELECT? Суть в том что при толстом JOIN, когда одна и та же сущность замаплена разными ассоциациями, ORM не может однозначно определить какая запись выборки относится к какой ассоциации. Одним из решений этой проблемы была замена не сортированной коллекции на List. Но нужно ещё замапить колонку для определения порядка элементов. Надо поискать предыдущее обсуждение по этому вопросу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 10:25 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 10:30 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
BlazkowiczTepKuH, Есть у меня подозрение на одно ограничение. Точно не вспомню. Но раньше насильное желание всё заджоинить приводило к исключению. Может в последних версиях исключение заменили на насильственный SELECT? А бес его знает :) Может заменили на SELECT :) BlazkowiczTepKuH, Суть в том что при толстом JOIN, когда одна и та же сущность замаплена разными ассоциациями, ORM не может однозначно определить какая запись выборки относится к какой ассоциации. Одним из решений этой проблемы была замена не сортированной коллекции на List. Но нужно ещё замапить колонку для определения порядка элементов. Надо поискать предыдущее обсуждение по этому вопросу. Что самое интересное в ссылке, что вы привели они наоборот рекомендуют использовать Set вместо List. У меня ведь и так Set. В общем случаи хиберу Set больше нравится чем List или иные коллекции. @LazyCollection(LazyCollectionOption.FALSE) к сожалению не прокатило :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 16:13 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
Atum1JPQL HQL или JPA Criteria API через них Это я пока оставляю, как воркэраунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 16:14 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
TepKuHКоллеги, Есть непонятка с Hibernate 5.1. Он делает SELECT вместо JOIN при маппинге одной Entity дваждый из разных child'ов. Вообщем задача такая: Есть мероприятие\конференция которая содержит коллекцию спикеров-хедлайнеров и коллекция докладов. Каждый спикер-хедлайнер маппится OneToOne к сущности UserEntity которая содержит всякие там детали (ФИО, соц. сети и прочее) Каждый доклад так же маппится на SpeakerEntity а он соответственно так же на UserEntity. Как мне заставить hibernate сущность UserEntity джоинить, а не доселективать? Вот навеяло вашей темой jpql как вернуть min max в одном запросе ? решил в очередной раз поразбираться что же там такое генерится и прошел в ужас !!! Простой запрос : Код: java 1. 2. 3. 4. 5. 6. 7. 8. генерит : Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2016, 10:43 |
|
||
|
Маппинг одной сущности дважды в hibernate
|
|||
|---|---|---|---|
|
#18+
Atum1решил в очередной раз поразбираться что же там такое генерится и прошел в ужас !!! Вы скорее всего не правильно создали hql. В вашем запросе я например не вижу джойна с shift'ом. А запрашиваемый объект Employee скорее всего с ним каким то образом маппится :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2016, 14:26 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=94&tid=2123966]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 384ms |

| 0 / 0 |
