Проблема запроса Hibernate - PullRequest
       3

Проблема запроса Hibernate

0 голосов
/ 16 декабря 2010

Я использую Hibernate. Моя база данных выглядит следующим образом

Категория имеет много атрибутов

категория класса содержит

private Set <Attribute> AllAttributes= new HashSet  <Attribute>();

атрибут класса

Как получить все категории вместе с их атрибутами, потому что я пытаюсь "из категории", но это не работает

Файл отображения категории:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Dec 16, 2010 8:37:02 AM by Hibernate Tools 3.4.0.Beta1 -->
<hibernate-mapping>
    <class name="com.BiddingSystem.Models.Category" table="CATEGORY">
        <id name="CategoryId" type="long">
            <column name="CATEGORYID" />
            <generator class="native" />
        </id>
        <property name="CategoryName" type="java.lang.String">
            <column name="CATEGORYNAME" />
        </property>

        <many-to-one name="ParentCategory" class="com.BiddingSystem.Models.Category">
            <column name="PARENT_CATEGORY_ID" />
        </many-to-one>

        <set name="SubCategory" lazy="false" cascade="all-delete-orphan" inverse="true">
            <key>
                <column name="PARENT_CATEGORY_ID" />
            </key>
            <one-to-many class="com.BiddingSystem.Models.Category" />
        </set>

        <set name="AllAttributes" table="ATTRIBUTE" inverse="false" lazy="true"  cascade="all">
            <key>
                <column name="CATEGORYID" />
            </key>
            <one-to-many class="com.BiddingSystem.Models.Attribute" />
        </set>

    </class>
</hibernate-mapping>

Файл сопоставления атрибутов:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Dec 16, 2010 5:25:09 AM by Hibernate Tools 3.4.0.Beta1 -->
<hibernate-mapping>
    <class name="com.BiddingSystem.Models.Attribute" table="ATTRIBUTE">
        <id name="AttributeId" type="long">
            <column name="ATTRIBUTEID" />
            <generator class="native" />
        </id>
        <property name="AttributeName" type="java.lang.String">
            <column name="ATTRIBUTENAME" />
        </property>
        <set name="Options" table="ATTRIBUTEOPTION" inverse="false"  cascade="all">
            <key>
                <column name="ATTRIBUTEID" />
            </key>
            <one-to-many class="com.BiddingSystem.Models.AttributeOption" />
        </set>
    </class>
</hibernate-mapping>

1 Ответ

2 голосов
/ 16 декабря 2010

Вы сопоставили ассоциацию с lazy="true". Это говорит hibernate о том, что по умолчанию атрибуты категории должны загружаться из базы данных только тогда, когда к ним фактически осуществляется доступ, в отличие от lazy="false", который указывает hibernate загружать атрибуты всякий раз, когда загружается категория. Однако директива в файле сопоставления влияет на все запросы.

Если вы хотите это только для определенного запроса, проверьте http://docs.jboss.org/hibernate/core/3.5/reference/en/html/queryhql.html#queryhql-joins:

Соединение "выборка" позволяет ассоциации или коллекции значений, которые будут инициализируется вместе с их родителем объекты с помощью одного выбора. Это особенно полезно в случае коллекция. Это эффективно переопределяет внешнее соединение и ленивые объявления файла сопоставления для ассоциаций и коллекции. См. Раздел 20.1, «Выбор стратегий» для более информация.

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens

Соединение для извлечения обычно не требуется назначить псевдоним, потому что связанные объекты не должны использоваться в предложении, где (или любой другой пункт). Связанные объекты также не возвращается прямо в Результаты запроса. Вместо этого они могут быть доступ через родительский объект. Единственная причина, по которой вам может понадобиться псевдоним если вы рекурсивно присоединитесь к извлечению Дальнейшая коллекция:

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens child
    left join fetch child.kittens

Конструкция выборки не может быть использована в запросы, вызываемые с использованием iterate () (хотя scroll () можно использовать). Выборка должна быть используется вместе с setMaxResults () или setFirstResult (), так как эти операции основаны на результирующих строках, которые обычно содержат дубликаты для нетерпеливых выборка коллекции, следовательно, число строк не то, что вы ожидаете. Выборка также не должна использоваться вместе с экспромтом с условием. это можно создать декартово произведение присоединяясь, выбирая более одного сбор в запросе, поэтому будьте осторожны в этот случай. Присоединяйтесь к получению нескольких Роли коллекции могут производить неожиданные результаты для отображений сумок, поэтому усмотрение пользователя рекомендуется, когда формулировка запросов в этом случае. Наконец, обратите внимание, что полное соединение и выборка правильное соединение не имеет смысла.

...