gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:57:09 24 4
gpt4 key购买 nike

我确信有一个 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>

最佳答案

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 的默认抓取策略。现在如果你想加载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 集。因此,无论何时需要,您都可以通过使用上面的查询来覆盖默认策略来获取 suppliers以及Product .

关于java - 如何避免查询调用关联对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19567439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com