перевод в спящий режим hql-запроса "много к одному", когда свойство внутренней выборки соединения не связано
-
11-09-2019 - |
Вопрос
У меня есть ассоциация "многие к одному", созданная подобным образом, в hbm.xml:
<many-to-one name="gigVenue"
class="blah.blah.xxx" fetch="select"
lazy="no-proxy" not-null="true" >
<column name="N_VENUE_ID" precision="18" scale="0" not-null="true" />
</many-to-one>
И я использую инструментарий для выполнения настоящей отложенной загрузки.
НО когда я запускаю запрос hql с внутренней выборкой соединения для другой таблицы, свойство, которое должно содержать объект, являющийся значением другой таблицы, остается равным null.Несмотря на то, что я вижу объект значения другой таблицы, создаваемый hibernate.
Есть ли у кого-нибудь какое-нибудь представление об этой проблеме?
Обновить:
from Gig g inner join fetch g.gigVenue gv where g.artistId = :artistId and (g.territoryId = -1 or g.territoryId = :territoryId) order by g.gigDatetime desc
<set name="gigs" inverse="true" lazy="true" table="DSP_GIG" fetch="select">
<key>
<column name="N_VENUE_ID" precision="18" scale="0" not-null="true" />
</key>
<one-to-many class="blah.blah.Gig" />
</set>
Решение
Поскольку вы используете инструментарий байтового кода вместо прокси-сервера ассоциации (почему?) вам нужно указать "извлекать все свойства" в вашем запросе:
from Gig g fetch all properties ...
Детали таковы здесь
Обновить: Ваш gigVenue
отображение - это настройка lazy
Для no-proxy
.Это означает, что свойство будет иметь значение NULL до тех пор, пока к нему не будет осуществлен первый доступ с помощью метода getter.Это делается с помощью инструментария байт-кода и не является чем-то, что обычно используется.Использование HQL join fetch
НЕ будет заполнять такое свойство;вы должны явно указать fetch all properties
как я описал выше.
Рассмотрите возможность установки lazy="proxy"
вместо этого (на самом деле это значение по умолчанию для "многие к одному"), которое инициализирует ваше свойство с помощью прокси-объекта, содержащего gigVenue
идентификатор во время первоначального выбора, затем извлеките фактический объект, как только вы получите доступ к одному из GigVenue
методы автора.Используя join fetch
в HQL также будет работать в этом случае выборка полного GigVenue
экземпляр во время первоначального выбора.
На этой ноте установка fetch="select"
это тоже сомнительно;скорее всего, вам лучше оставить его по умолчанию join
настройка, позволяющая использовать внешние соединения для выборки.
Другие советы
Инструменты на самом деле не влияют на запросы и то, как они работают. Почему именно вы делаете в запросе? Вы пытаетесь ускорить?
А также небольшой вопрос, на всякий случай, как ты знать Значение ноль? Это с помощью отладчика Java или это фактически вызывая метод «получить»? С инструментами поле, как правило, будет нулевым, пока вы не попросите поле.