У меня есть 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 НЕ вызывалась лениво - как мне это сделать?
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 также не следует использовать вместе с экспромтом с условием. Можно создать декартово произведение, присоединившись к выборке нескольких коллекций в запросе, поэтому будьте осторожны в этом случае. Объединение выборки нескольких ролей коллекции может привести к неожиданным результатам для сопоставлений пакетов, поэтому при формулировании запросов в этом случае рекомендуется проявлять осторожность. Наконец, обратите внимание, что выборка полного соединения и выборка правого соединения не имеют смысла.
Просто для справки, я однажды столкнулся с чем-то вроде этого, где спящий режим всегда с нетерпением загружал набор для меня.
Оказывается, у меня был такой сеттер:
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
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.