Как переопределить стратегию получения hibernate во время выполнения
я увидел следующее утверждение в книге "Спящий режим в действии". любой может сказать мне, как переопределить стратегию во время выполнения. и можете ли вы сделать противоположный способ, который у меня есть выбор стратегии ленивый как ложный, и я хочу установить его истинным?
"Lazy fetching позволяет вам решить, сколько из графика объекта загружено в первый
попадание базы данных и какие ассоциации следует загружать только тогда, когда они сначала
доступ. Ленивая выборка является основополагающим понятием в сохранении объекта и
первый шаг к достижению приемлемой производительности.
Мы рекомендуем, чтобы, во-первых, все ассоциации были настроены для ленивых (или, возможно,
пакетный ленивый), загружаемый в файл сопоставления. Эта стратегия может быть затем переопределена
во время выполнения по запросам, из-за которых возникает желание получать.
Ответы
Ответ 1
Если вы используете HQL для своих запросов, вы можете указать желаемую выборку, используя ключевое слово "выборка", например:
from Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens child
left join fetch child.kittens
Если вы используете API запросов Query, вы можете указать режим выборки, используя setFetchMode
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.setFetchMode("kittens", FetchMode.EAGER)
.list();
Ответ 2
Использовать профили извлечения: http://docs.jboss.org/hibernate/core/3.5/reference/en/html/performance.html#performance-fetching-profiles
Ответ 3
Для запроса нетерпеливый вы можете написать что-то вроде этого с помощью поставщика LINQ:
List<Customer> customers = session.Query<Customer>().Fetch(c => c.Orders).ToList();
Это заполняет все Заказы для всех выбранных Клиентов в одном запросе SQL:
select
customer0_.CustomerId as CustomerId0_0_,
customer0_.ContactName as ContactN3_0_0_,
orders1_.CustomerId as CustomerId0__,
orders1_.OrderId as OrderId0__
orders1_.OrderDate as OrderDate3_1_,
from Customers customer0_
left outer join Orders orders1_
on customer0_.CustomerId = orders1_.CustomerId
Вы также можете получить коллекции внуков (см. здесь).