Ленивая загрузка и загрузка - это концепции, которые должны присутствовать в каждом ORM. Давайте родитель-ребенок отношение:
class Parent {
String name;
List<Child> childs;
}
class Child {
String name;
}
При загрузке элемента Parent, ОРМ должен решить, если он загружает коллекцию Чайлдс также (через присоединиться к примеру), или если он задерживает запрос для загрузки в Чайлдс, пока вы на самом деле доступ к коллекции
parent.childs.get(0)
- При загрузке Чайлдс коллекцию вперед, то есть, прежде, чем получить доступ к коллекции, он охотно ЗАГРУЗКА потому что вы ждете, чтобы получить доступ к Чайлдс. Это можно сделать в одном запросе с недостатком приведения большего количества данных из БД.
- Когда вы задерживаете нагрузку до момента обращения к фактической коллекции, ее называют ленивой загрузкой, потому что вы получаете только детей, когда они строго необходимы. Это полезно для получения только данных, когда это необходимо, за счет дополнительных запросов (например, для этой темы вы можете запросить Google для «N + 1 select hibernate»).
Если вы хотите вызвать запрос для извлечения дочерних элементов при обращении к коллекции, вам понадобится какой-либо обратный вызов/перехват в коллекции childs. Это делается через прокси-сервер в коллекции, поэтому вы можете перехватить каждый доступ к коллекции для получения данных из db. Вот почему вам нужна библиотека прокси/перехвата, такая как Castle.
+1 Хорошее объяснение. – ewernli