Hibernate Fetching Eager vs Lazy, как это работает?
Всем привет на данный момент разбираюсь с фреймворком и наткнулся на тему Fetching Types , не может уложится в моей голове сам процесс того как достаются и держатся в памяти данные с базы данных при этих подходах.
Кто может дать подробное объяснение этому или хороший ресурс в интеренете с кодом ?
Для чего используется EAGER подход ? Для чего Lazy ? Чем конкретнее и детальнее ответ тем лутше! СПС!
Все просто
Если есть две зависимые таблицы, то при выборке из одной из них
при eager будут подтянуты данные из выбираемой таблицы и из зависимой
при lazy зависимая таблица будет подтянута только когда к ней действительно будет обращение в коде
Допустим зависимая таблица это встроенная колекция в выбираемой таблици User. Колекция адресов для юзера, на эту колекцию я ставлю LAZY тип, эта колекция сожержит один из адресов к которому я обратился , как будет загруженна колекция ?
Ничего имхо не поменяется что lazy, что eager для зависимой таблицы рояли не играет. Вот если на таблицу user поставить lazy, то выбирая из user зависимвя коллекция будет загружена только когда к ней будет обращение.
Axian Ltd.: " Ничего имхо не поменяется что lazy, что eager для зависимой таблицы рояли не играет! " : Приведу пример кода в дальнейшем .. То есть колекция загружется вся ? Не важно стоит ли там LAZY или EAGER , так как было данно обрашение к этой встроенной колекции ?
Вы прочитайте еще раз на что влияет lazy/eager - на загрузку зависимой таблицы при выборке из основной. На ваш вопрос невозможно ответить так как неизвестно в каком режиме идет обращение к основной таблице и есть ли оно вообще, какого рода зависимости в таблицах и как это отображается в код.
Хорошо, допустим вы обратились к коллекции, режим lazy, коллекция загрузится ровно в том объеме, в каком был сделан запрос. А вот соответствующая запись user грузится в этом режиме не будет, пока к ней не будет сделано явное обращение.
" Коллекция загрузится ровно в том объеме, в каком был сделан запрос " так я это и пытаюсь узнать сам процесс загрузки этого обьёма .. Именно КАК он загружается ? Допустим - загрузка может происходить до того момента как нашли подходяший адрес к которому было дано обращения и который находится в колекции а после чего остальные адресса в колекции не загружаются . Этим и отличается LAZY от EAGER ? Так как если бы поставилил тип загрузки EAGER то была бы подтянута в память вся колекция и после чего выдан тот адрес который мне нужен .. Я правильно понял ? То есть при LAZY происходит экономия памяти ?
Как вы обращаетесь в hibernate к коллекции, как делаете выборку? Это вопрос к вам, вы так и не указали что вы выбираете из базы и к чему пытаетесь обратиться. Если вы выбираете из базы user, то коллекции связанные с выборкой user загружены не будут, то есть совсем (это при lazy). Если вы из базы выбираете коллекцию, то user (при lazy) связанные с зарруженными даными коллекций тоже загружаться не будут до обращения к ним.