перевод в спящий режим hql-запроса "много к одному", когда свойство внутренней выборки соединения не связано

StackOverflow https://stackoverflow.com/questions/1237346

Вопрос

У меня есть ассоциация "многие к одному", созданная подобным образом, в 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 или это фактически вызывая метод «получить»? С инструментами поле, как правило, будет нулевым, пока вы не попросите поле.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top