Я работаю над проектом, который имеет богатую объектную модель с различными наборами совокупных корней.
Мы используем стек Castle (от монорельса до nHibernate с ActiveRecord).
Мы пометили агрегатные корни как ленивые [ActiveRecord(Lazy = true)]
и настроили подпрограммы 'нетерпеливых' в нашем репозитории для нетерпеливого извлечения графа объектов. Мы используем HQL для определения активных выборок из нашей дочерней коллекции нашего корня,
например. если Account
является агрегатным корнем (и отмечен как загруженный ленивый), мы будем стремиться получить Account .. Order .. Product
сущностей для полного графа.
Так что никаких сюрпризов пока (надеюсь).
Теперь, если в приведенном выше примере Product также помечен [ActiveRecord(Lazy = true)]
, похоже, это останавливает директиву eager fetch в HQL.
Кто-нибудь знает способ принудительного извлечения лениво загруженного дочернего объекта ??
Приветствие
Иэн
Обновление
Хорошо, вот некоторый пример hql. Используя пример из me.yahoo.com/../1 ниже, мы используем IMuliQuery для восстановления N + 1 зависимостей при выборке по отношениям «многие ко многим». Мы также явно используем классы отображения «многие ко многим». В результате наш hql:
from Account a 'm eager loading the graph
inner join fetch a.AccountsOrders ao
inner join fetch ao.Order
from Account a 'm eager loading the graph
inner join fetch a.AccountAddresses aa
inner join fetch aa.Address ad
where a.ID = ?
... так что это выполняет операторы 2 sql и возвращает необходимый минимальный набор строк, и мы можем разрешить это в виде единого графа объектов. Ницца.
Но ... если, скажем, Address
был отмечен как ленивый загруженный (а Order
не был), доступ к Order
не вызывает дальнейших операторов sql, а доступ к Address
делает, несмотря на Факт, что оба загружены.
Так почему же лениво загруженная сущность Address
, указанная выше, не стремится получить из вышеприведенного утверждения?