У меня есть 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>

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

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

0
nos 21 Авг 2010 в 13:52

2 ответа

Лучший ответ

Справочное руководство по hibernate пишет :

Соединение «выборка» позволяет инициализировать ассоциации или коллекции значений вместе с их родительскими объектами с помощью единственного выбора. Это особенно полезно в случае коллекции. Он эффективно переопределяет внешнее соединение и ленивые объявления файла сопоставления для ассоциаций и коллекций. См. Раздел 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 () можно использовать). Fetch следует использовать вместе с setMaxResults () или setFirstResult (), поскольку эти операции основаны на строках результатов, которые обычно содержат дубликаты для активной выборки коллекции, следовательно, количество строк не то, что вы ожидаете. Fetch также не следует использовать вместе с экспромтом с условием. Можно создать декартово произведение, присоединившись к выборке нескольких коллекций в запросе, поэтому будьте осторожны в этом случае. Объединение выборки нескольких ролей коллекции может привести к неожиданным результатам для сопоставлений пакетов, поэтому при формулировании запросов в этом случае рекомендуется проявлять осторожность. Наконец, обратите внимание, что выборка полного соединения и выборка правого соединения не имеют смысла.

3
meriton 21 Авг 2010 в 14:04

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

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

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;
}

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

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

0
rogerdpack 1 Авг 2013 в 00:34