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>
4

2 回答 2

1

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

但是如果你已经为 定义了lazy="false"Set of SuppliersHibernate 会随着Product.

如下更改suppliers映射,这样 Hibernate 就不会急切地获取它:

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

编辑:

上述映射是suppliers. 现在,如果您想与suppliers一起加载Product,可以在代码中在运行时覆盖此默认策略:

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.

于 2013-10-24T13:43:49.887 回答
0

将供应商集的 fetchtype 设置为 LAZY(而不是 EAGER)。

于 2013-10-24T13:35:43.500 回答