如果有一個實體A與雙向一或零到一的映射與實體B.如何延遲加載經由HQL一對一的組合物
的映射如下:
<class name="EntityA" table="TABLE_A" mutable="true" lazy="true">
<id name="idA" type="long" column="pk_a" unsaved-value="null">
<generator class="sequence">
<param name="sequence">pk_a_seq</param>
</generator>
</id>
<one-to-one name="propertyB" class="EntityB" property-ref="propertyA" constrained="true" outer-join="false"/>
</class>
和
<class name="EntityB" table="TABLE_B" mutable="true" lazy="true">
<id name="idB" type="long" column="pk_b" unsaved-value="null">
<generator class="sequence">
<param name="sequence">pk_b_seq</param>
</generator>
</id>
<many-to-one name="propertyA" class="EntityA" not-null="true" unique="true" lazy="proxy" column="fk_a"/>
</class>
當我做EntityA一個HQL查詢(或者更確切地說,一個命名HQL查詢),休眠急切地加載EntityA#propertyB一個單獨的select語句。
我的問題是,如果我的hql返回1000個EntityA(都有自己的EntityB),hibernate會做n + 1個查詢(第一個查詢是EntityA返回1000個結果,而n個查詢會到來從EntityA#屬性B選擇延遲加載)。
但是,我不需要那些EntityA#屬性B的,這就是爲什麼我想懶惰加載它們(沒有休眠使用單獨的SQL查詢)。
這可能嗎?如果是這樣,我該怎麼做?
感謝, 弗朗茨
我不完全瞭解問題。如果您爲一組EntityA執行hql,則只要您調用代理方法EntityA.getPropertyB(),就會通過單獨的查詢加載相應的EntityA#propertyB。這是正常的懶惰加載行爲。你想要什麼行爲? – 2009-06-08 14:20:00