2013-10-24 23 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)为供应商设置。