2012-03-16 3 views
0

Организация сопоставляется Адрес в 1-к-1:Hibernate - п + 1 выберите запросы с 1-на-1

организации:

<one-to-one class="Address" constrained="true" name="address" property-ref="organizationId"/> 

Адрес:

<many-to-one class="Organization" name="organization"> 
      <column name="OrganizationID" not-null="false" unique="true"/> 
    </many-to-one> 

этот запрос генерирует дополнительный переход для каждой организации + 1:

query = session.createQuery("select o from Organization as o where o.isCool=0").setReadOnly(true); 
    organizations = query.list(); 

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html сообщает fetch="join", но это не имеет никакого значения. Как решить эту проблему? Любая помощь приветствуется.

EDIT В отладчике я вижу, что адрес на самом деле не ленивый, я понятия не имею, почему.

ответ

1

Поскольку вы используете HQL для извлечения ваших материалов, это не поможет просто использовать аннотацию или атрибут, который вы пытаетесь, чтобы избежать проблемы n + 1.

Правильным решением было бы использовать предложение FETCH JOIN в вашем запросе. Более подробную информацию можно найти по следующей ссылке: http://www.realsolve.co.uk/site/tech/hib-tip-pitfall.php?name=n1selects

+0

Благодарим за ответ. Но эффективно ли хранить все данные в памяти и не использовать их? Я не возражаю против использования hql. Так что мне нужно использовать критерии? – emmma1223

+0

Вы можете продолжать использовать HQL. Фактически, он все равно доставит вам только нужный материал (записи, где условие o.isCool = 0 истинно), но без выполнения n + 1 выборки - то есть, если вы используете предложение FETCH JOIN. – PaiS

+0

, пожалуйста, не стесняйтесь, я не совсем понимаю. Итак, вы говорите, что объединение fetch не будет инициализировать адреса? – emmma1223

Смежные вопросы