В основном отложенная загрузка имеет больше преимуществ, чем энергичная альтернатива (производительность, использование ресурсов). Так как это настройка по умолчанию для всех отношений (начиная с Grails 1.1), вам обычно не следует настраивать ее для активной выборки, если только у вас не возникнут определенные проблемы. Такие как:
- Совместное использование экземпляра домена в разных сеансах гибернации (например, при помещении экземпляра класса домена в область сеанса http и доступе к свойствам из него, например, пользователю)
- Получение исключения LazyInitializationException при доступе к экземплярам классов домена в макетах / представлениях
- Если вы уверены, что вы будете получать доступ к определенному свойству отношения каждый раз (или большую часть времени) при получении экземпляра, также имеет смысл настроить это отношение для быстрой загрузки.
Стремительная выборка может быть довольно опасной при работе с огромными базами данных. Представьте себе класс Domain, подобный этому:
// really bad example
class TreeNode {
String name
TreeNode parent
static hasMany = [ childNodes: TreeNode ]
static mapping {
parent lazy: false
childNodes lazy: false
}
}
когда вы читаете любой из экземпляров TreeNode, он автоматически вытягивает все остальные экземпляры класса домена из базы данных в вашу память. Когда будет достаточно экземпляров, вы, вероятно, убьете свое приложение, выбрав только 1 экземпляр.