Как заставить Hibernate выполнять не более одного SQL-запроса на отношения родитель / потомок в WebLogic 10g? - PullRequest
2 голосов
/ 05 октября 2011

Нам нужно вернуть коллекцию виджетов, где каждый виджет может содержать ноль или более виджетов.Наша проблема в том, что всякий раз, когда мы запускаем from Widget, Hibernate генерирует один SQL-запрос для каждого Fidget в каждом Widget.Так что, если у меня есть один виджет с 19 виджетами, Hibernate запускает 20 SQL-запросов!Я ожидал бы только два запроса: один для виджета и один для непоседы.

У нас есть SQL Server 2005 и WebLogic 10g.

Моя соответствующая конфигурация Spring:

<jee:jndi-lookup id="dataSourceA" jndi-name="jdbc/dataSourceA" />
<bean id="sessionFactoryA" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSourceA" />
    <property name="mappingResources">
        <list>
            <value>com/mycompany/database/Widget.hbm.xml</value>
            <value>com/mycompany/database/Fidget.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <value>
            hibernate.query.factory_class=org.hibernate.hql.classic.ClassicQueryTranslatorFactory
            hibernate.dialect=org.hibernate.dialect.SQLServerDialect
            hibernate.show_sql=true
        </value>
    </property>
</bean>
<bean id="transactionManagerA" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactoryA" />
</bean>

My Widget.hbm.xml:

<class name="Widget" package="com.mycompany.database">
    <id name="id" column="ID" type="integer">
        <generator class="identity" />
    </id>
    ...
    <set name="fidgets" table="Fidget" lazy="false">
        <key column="WidgetID" />
        <one-to-many class="Fidget" />
    </set>
</class>

My Fidget.hbm.xml:

<class name="Fidget" package="com.mycompany.database">
    <id name="id" column="ID" type="integer">
        <generator class="identity" />
    </id>
    ...
    <many-to-one name="widget" column="WidgetID" class="Widget" lazy="false" />
</class>

Hibernate генерирует следующий SQL-код для виджета с четырьмя Fidget иВиджет с шестью непоседами:

select fidget_.Col1, fidget_.Col2, ... from Fidget fidget_ where fidget_.WidgetID = 7
select fidget_.Col1, fidget_.Col2, ... from Fidget fidget_ where fidget_.WidgetID = 7
select fidget_.Col1, fidget_.Col2, ... from Fidget fidget_ where fidget_.WidgetID = 7
select fidget_.Col1, fidget_.Col2, ... from Fidget fidget_ where fidget_.WidgetID = 7
select fidget_.Col1, fidget_.Col2, ... from Fidget fidget_ where fidget_.WidgetID = 8
select fidget_.Col1, fidget_.Col2, ... from Fidget fidget_ where fidget_.WidgetID = 8
select fidget_.Col1, fidget_.Col2, ... from Fidget fidget_ where fidget_.WidgetID = 8
select fidget_.Col1, fidget_.Col2, ... from Fidget fidget_ where fidget_.WidgetID = 8
select fidget_.Col1, fidget_.Col2, ... from Fidget fidget_ where fidget_.WidgetID = 8
select fidget_.Col1, fidget_.Col2, ... from Fidget fidget_ where fidget_.WidgetID = 8

1 Ответ

1 голос
/ 05 октября 2011

Включить пакетную выборку в конфигурации Hibernate, чтобы уменьшить количество запросов, или выполнить запрос, который загрузит виджеты и их виджеты:

select w from Widget w left join fetch w.fidgets where ...

Это также хорошо описанов справочной документации , которая является отличным источником информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...