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

Java 如何避免查询调用关联对象,java,hibernate,Java,Hibernate,我确信这有一个冬眠术语,但我不确定它是什么(因此我可能会查找答案),但这里是 我有一个产品Pojo,其中一个字段是一组供应商(也是一个Pojo)。当我打电话获取产品列表时,默认情况下,它会查询以获取供应商列表——这正是我所期望的 然而,有时我不需要集合中的数据,查询它花费的时间太长了。有时有没有办法避免查询集合的数据 还是我的设计不正确 My Product.hbm.xml映射文件具有: <?xml version="1.0"?> <!DOCTYPE hibernate-map

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

我有一个产品Pojo,其中一个字段是一组供应商(也是一个Pojo)。当我打电话获取产品列表时,默认情况下,它会查询以获取供应商列表——这正是我所期望的

然而,有时我不需要集合中的数据,查询它花费的时间太长了。有时有没有办法避免查询集合的数据

还是我的设计不正确

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

...
...

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

Hibernate的默认行为是您所期望的:默认情况下,不会加载为一个实体映射的所有集合以及所有关联实体,无论是通过
到多个
还是
到一个
关联

但是,如果您已经为
供应商集定义了
lazy=“false”
,Hibernate将急切地获取相关的集合以及
产品

按如下所示更改
供应商
映射,以便Hibernate不会急于获取它:

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

上述查询将获取
产品
以及
供应商集
。因此,在需要时,您可以通过使用上述查询来覆盖默认策略,以获取供应商以及产品。如果您使用注释,您可以使用hibernate映射文件或实体类更新您的问题吗?最好还是删除此默认值lazy=“false”并根据需要在映射级别或在单个查询中重写。我现在“未能延迟初始化角色集合:model.Suppliers,没有会话或会话已关闭”。在需要时,它不会查询以获取数据吗?
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();