Hibernate с нетерпением загрузить ассоциацию, которая обычно ленива - PullRequest
0 голосов
/ 21 августа 2010

У меня есть эти 2 отображения:

<hibernate-mapping>
    <class name="sample.Operator" table="OPERATOR">
        <id name="id" >
            <generator class="native" />
        </id>
        <property name="name"  not-null="true">
            <column name="NAME" />
        </property>
        <set name="pointCodes" inverse="false" lazy="true" cascade="save-update">
            <key>
                <column name="OperatorID" />
            </key>
            <one-to-many class="sample.PointCode" />
        </set>
    </class>

<hibernate-mapping>
 <class name="sample.PointCode" table="POINTCODE">
  <id name="id">
   <generator class="native" />
  </id>
  <properties name="pointCodeKey" unique="true">
   <property name="pointCode" not-null="true">
   </property>
   <property name="networkIndicator" not-null="true">
   </property>
  </properties>
  <property name="name" not-null="true">
  </property>
 </class>
  </hibernate-mapping>

Большую часть времени при создании оператора я хочу, чтобы pointCodes выбирались лениво, поэтому я не хочу устанавливать lazy = "false" в отображениях,

Однако у меня есть один запрос, например session.createQuery("from Operator").list() где я хочу, чтобы ассоциация pointCodes не получалась лениво - как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 21 августа 2010

Справочное руководство по спящему режиму пишет :

Соединение "извлечение" позволяет инициализировать ассоциации или коллекции значений вместе с их родительскими объектами с помощью одного выбора.Это особенно полезно в случае коллекции.Он эффективно переопределяет внешние объединения и ленивые объявления файла сопоставления для ассоциаций и коллекций.См. Раздел 20.1, «Стратегии выборки» для получения дополнительной информации.

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens

Соединению выборки обычно не требуется назначать псевдоним, поскольку связанные объекты не должны использоваться в предложении where (или любом другом предложении).).Связанные объекты также не возвращаются непосредственно в результаты запроса.Вместо этого они могут быть доступны через родительский объект.Единственная причина, по которой вам может понадобиться псевдоним, заключается в том, что вы рекурсивно присоединяетесь к извлечению дополнительной коллекции:

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens child
    left join fetch child.kittens

Конструкция fetch не может использоваться в запросах, вызываемых с использованием iterate () (хотя может использоваться scroll ()),Извлечение следует использовать вместе с setMaxResults () или setFirstResult (), так как эти операции основаны на строках результата, которые обычно содержат дубликаты для быстрого извлечения коллекции, следовательно, число строк не соответствует ожидаемому.Выборка также не должна использоваться вместе с экспромтом с условием.Можно создать декартово произведение, объединив несколько запросов в запросе, поэтому будьте осторожны в этом случае.Выборка из нескольких ролей в коллекции может привести к неожиданным результатам для сопоставлений пакетов, поэтому при формулировании запросов в этом случае рекомендуется действовать по усмотрению пользователя.Наконец, обратите внимание, что полная выборка и правая выборка не имеют смысла.

0 голосов
/ 01 августа 2013

Ради справки я однажды столкнулся с чем-то подобным, когда hibernate всегда с нетерпением загружал для меня набор.

Оказывается, у меня был такой сеттер:

public void setStreams(Set<StreamRef> streams) {
  for (StreamRef s : (Set<StreamRef>) streams) {
    s.setTape(this); // boo on hibernate, which apparently needs this. whoa!
  }
this.streams = streams;
}

, который вызывался hibernate (передавая ему указатель на ленивый набор), но затем цикл for в основном вызывал его для загрузки в этот момент. Если это помогает любым последователям:)

Вы можете проверить, лениво ли это, закрыв сессию, а затем попытаться перебрать коллекцию. Если лень, вы получите org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: XX.streams, no session or session was closed

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...