2013-10-24 53 views
0

我確定這裏有一個休眠期限,但我不確定它是什麼(因此我可能會查找答案),但是這裏就是了。如何避免調用關聯對象的查詢

我有一個產品Pojo,其中一個字段是一組供應商(也是一個Pojo)。當我打電話來獲取產品列表時,默認情況下它會查詢以獲取供應商列表 - 這正是我所期望的。

但是,有時我不需要Set中的數據,並且查詢它需要很長時間才能承受。有沒有辦法避免查詢Set的數據?

或者是我的設計不正確?

我Product.hbm.xml映射文件:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping default-access="field" default-lazy="false" package="model"> 
<class name="model.Product" table="PRODUCT"> 
    <id column="PRODUCT_ID" name="id" type="long"> 
     <generator class="native" /> 
    </id> 

    ... 

    <set name="suppliers" sort="unsorted" table="SUPPLIERS"> 
     <key column="PRODUCT_ID" /> 
    <one-to-many class="model.Suppliers" /> 
    </set> 

    ... 

</class> 
</hibernate-mapping> 
+0

如果您使用註釋,您是否可以使用hibernate映射文件或實體類更新您的問題? –

回答

1

Hibernate的默認行爲就是您所期望的:通過to-manyto-one關聯映射到實體和所有關聯實體的所有集合,默認情況下都未加載。

但是,如果您已爲Set of Suppliers定義lazy="false",則Hibernate將與Product一起熱切獲取關聯的集合。

變化,如下suppliers映射,使Hibernate不會急切地取,

<set name="suppliers" sort="unsorted" table="SUPPLIERS" lazy="true"> 
     <key column="PRODUCT_ID" /> 
    <one-to-many class="model.Suppliers" /> 
</set> 

編輯:

以上映射是suppliers默認的抓取策略。現在,如果要加載suppliersProduct一起,你可以在運行時代碼重寫此默認策略:

String productSelect = "select p from Product " 
       + "p left join fetch p.suppliers " 
       + "where p.productName=:pname"; 
Query query = session.createQuery(productSelect); 
query.setParameter("pname", productname); 
Product result = (Product) query.uniqueResult(); 

上面的查詢會與一組suppliers沿取Product。因此,無論何時需要,您都可以使用上述查詢覆蓋默認策略suppliers以及Product

+0

更好的是,在映射級別或單個查詢中,刪除此default-lazy =「false」並根據需要進行覆蓋。 –

+0

我現在「沒有懶惰地初始化角色集合:model.Suppliers,沒有會話或會話被關閉」。在需要時不會查詢獲取數據嗎? – Vishal

+0

編輯我的答案。希望對你有幫助 –

0

設置fetchtype爲LAZY(而不是EAGER)爲供應商設置。