Нам нужно вернуть коллекцию виджетов, где каждый виджет может содержать ноль или более виджетов.Наша проблема в том, что всякий раз, когда мы запускаем 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