|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Documentation: @LazyCollection - The @LazyCollection annotation is used to specify the lazy fetching behavior of a given collection. The possible values are given by the LazyCollectionOption enumeration: TRUE - Load it when the state is requested. FALSE - Eagerly load it. EXTRA - Prefer extra queries over full collection loading. The TRUE and FALSE values are deprecated since you should be using the JPA FetchType attribute of the @ElementCollection, @OneToMany, or @ManyToMany collection. The EXTRA value has no equivalent in the JPA specification, and it’s used to avoid loading the entire collection even when the collection is accessed for the first time. Each element is fetched individually using a secondary query . Entities: Код: 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.
Code: Код: 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.
Console (output): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Если я все правильно понимаю, то при использовании Код: java 1. 2.
Когда мы тянем из базы Department entity Код: java 1.
то будет задействован Lazy fething (employees не подтянутся). Но потом когда мы к ним постучимся, они должны дергаться по одной штуке: Код: java 1. 2. 3. 4. 5.
В логе я вижу один select, который соответствует Lazy fetching : Код: java 1.
Но не вижу три дополнительных селекта. При этом данные по Employees оторбажаются. Куда пропали три дополнительные selects? Или тут все таки был Eager fetching? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 14:55 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Переписал немного код: Код: java 1. 2. 3. 4. 5. 6.
Теперь вывод такой: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Теперь все логично, но не понятно как работает первый вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 15:02 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Материал взят отсюда - https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#fetching-LazyCollection И там вывод должен быть таким: Код: 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.
Т.е. получается кроме трех дополнительных selects не хватает еще одного, Код: java 1. 2. 3. 4. 5. 6. 7. 8.
который выполняется при: Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 15:16 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Почитал, тут про @LazyCollection. Пишут, что эта штука 300 лет никому не нужна, так что можно забыть про нее. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 15:45 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Код: java 1. 2. 3. 4. 5.
A Hibernate в курсе, что переменная department - это entity? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 15:55 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Псевдомизантроп, ну да. Я ему вроде все понятно объяснил (см. приложенный код): Код: 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.
Причем когда я немного переписал код (опять же см. приложенный код), то дополнительные seelcts появились. Я подозреваю, что все работает, только логи не выводятся. В любом случае, насколько я понял эта аннотация малоприменима. С помощью нее конечно можно узнать размер коллекции (не вытаскивая ее всю из базы), но где это можно применить - хз. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 16:10 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
faustgreen, в чём принципиальная разница между переменными department и department2? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 16:17 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Переменная department создается при пустой базе, наполняется содержимым и сохраняется в бд. Потом с помощью Код: java 1. 2.
чиститься контекст, чтоб из кэша не читать. А потом она же вычитывается из БД в переменную department2. Почему переменные по разном называются? - я пока только разбираю Hibernate, и не до конца уверен, что можно в туже переменную вычитывать новое значение, не будет ли там каких конфликтов(вроде не должно ничего такого быть, но все же... перестраховываюсь кароче). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 16:31 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
faustgreen Переменная department создается вычитывается из БД в переменную department2 Выделил ключевое. Почитай про persistent context, как обычные java объекты становятся entity, про entity lifecycle. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 16:47 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Это я более менее знаю. Когда создали новую сущность у нее статус - transient (в базе ее нет пока, йадишник может быть, может не быть). После такго как сделали entityManager.persist(entity) - перешла в статус "managed" или "persistent (есть айдишник, сохранена в бд, лежит в кэше первого уровня)" Когда сделали entityManager.сlear() - она стала "detached" (лежит в базе с айдишником, но не связана с нашей локальной переменной, в кэше первого левела отсутствует). Когда мы делаем entityManager.find(entity, id) она тянется из базы (выполняется select) и она снова становиться "managed". Вроде все правильно понимаю, но на пример это помойму не влияет. Или не так себе все представляю, как должно быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 17:10 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
faustgreen После такго как сделали entityManager.persist(entity) - перешла в статус "managed" или "persistent (есть айдишник, сохранена в бд, лежит в кэше первого уровня)" Что в этот момент происходит с точки зрения объектов и ссылок на них (переменных)? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 17:34 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Если правильно помню, то если объект лежит в кэше на момент запроса, то вернется тот же объект (Ссылка не поменятеся). Но если в кэше нет - будет создан новый (присвоена новая ссылка). Но опять же не уверен точно. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 17:37 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Если так, то да, получается можно было бы не создавать вторую переменную. Но это второстепенное, это я потом еще раз перечитаю. Больше интересен сам пример, который описал, почему так работает аннотация @LazyCollection? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 17:39 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
faustgreen будет создан новый (присвоена новая ссылка) Чему именно будет присвоена новая ссылка? Происходит ли это с переменной department? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 17:40 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Если у нас есть переменная Код: java 1. 2. 3. 4.
Если же department в статусе detached, то переменной присвоится новая ссылка: Department department = entityManger.find() = (ссылка2) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 17:50 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Если у нас есть переменная department в статусе "managed", то ей будет присвоена та же ссылка, то есть фактически ничего не произойдет. Код: java 1. 2. 3.
Если же department в статусе detached, то переменной присвоится новая ссылка: Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 17:51 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
faustgreen Если у нас есть переменная department в статусе "managed", то ей будет присвоена та же ссылка, то есть фактически ничего не произойдет. Код: java 1. 2. 3.
Если же department в статусе detached, то переменной присвоится новая ссылка: Код: java 1.
Правильно Теперь посмотри внимательно на самый первый пост с исходным кодом твоего примера. Что там происхожит с переменной department? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 17:54 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Ну вот(добавил вывод ссылок): Код: 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.
Результат: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Ссылки разные. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 18:04 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Извиняюсь, не тот лог выдал. Вот что получилось, но там также разные ссылки, я ж кэш почистил: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 18:06 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
итого, есть переменная department, есть переменная department2. указывают, как выяснилось, на разные объекты. Что это за объекты, что о них знает hibernate? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 18:09 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Все! Я ж ем у говорю: Код: java 1.
Т.е. он знает класс, знает id, знает mapping + все аннотации класса. Я не понимаю, что ты хочешь сказать ... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 18:15 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Department department2 = entityManager.find(Department.class, 1L); int employeeCount = department .getEmployees().size(); ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 18:19 |
|
Hibernate @LazyCollection
|
|||
---|---|---|---|
#18+
Ладно, я на сегодня забодался уже, пойду отдыхать. Спасибо за попытку помочь, хотя бы укрепился в некоторых знаниях. ps. Я пока только разбираюсь, возможно не догоняю пока всего... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 18:19 |
|
|
start [/forum/topic.php?fid=59&gotonew=1&tid=2120573]: |
0ms |
get settings: |
22ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
10ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
410ms |
get tp. blocked users: |
1ms |
others: | 311ms |
total: | 841ms |
0 / 0 |