Подтвердить что ты не робот

Как переопределить стратегию получения hibernate во время выполнения

я увидел следующее утверждение в книге "Спящий режим в действии". любой может сказать мне, как переопределить стратегию во время выполнения. и можете ли вы сделать противоположный способ, который у меня есть выбор стратегии ленивый как ложный, и я хочу установить его истинным?

"Lazy fetching позволяет вам решить, сколько из графика объекта загружено в первый попадание базы данных и какие ассоциации следует загружать только тогда, когда они сначала доступ. Ленивая выборка является основополагающим понятием в сохранении объекта и первый шаг к достижению приемлемой производительности. Мы рекомендуем, чтобы, во-первых, все ассоциации были настроены для ленивых (или, возможно, пакетный ленивый), загружаемый в файл сопоставления. Эта стратегия может быть затем переопределена во время выполнения по запросам, из-за которых возникает желание получать.

4b9b3361

Ответ 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();

Ответ 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

Вы также можете получить коллекции внуков (см. здесь).