如何避免查询调用关联对象

时间:2013-10-24 13:32:11

标签: java hibernate

我确信这有一个休眠术语,但我不确定它是什么(因此我可以查找答案)但是这里有。

我有一个产品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>

2 个答案:

答案 0 :(得分:1)

Hibernate的默认行为是您所期望的:默认情况下不会加载为实体映射的所有集合,以及通过to-manyto-one关联映射的所有关联实体。

但是如果您为lazy="false"定义了Set of Suppliers,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();

上述查询将获取Product以及suppliers的集合。因此,在需要的地方,您可以使用上述查询覆盖默认策略,以获取suppliersProduct

答案 1 :(得分:0)

为供应商Set设置fetchtype为LAZY(而不是EAGER)。