我确信这有一个休眠术语,但我不确定它是什么(因此我可以查找答案)但是这里有。
我有一个产品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 :(得分:1)
Hibernate的默认行为是您所期望的:默认情况下不会加载为实体映射的所有集合,以及通过to-many
或to-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
。
答案 1 :(得分:0)
为供应商Set设置fetchtype为LAZY(而不是EAGER)。