你如何用hibernate以编程方式关闭热切的提取?

时间:2009-09-03 10:46:18

标签: hibernate subquery eager

我在映射中有一个关联到一个急切加载的集合(lazy =“false”fetch =“subselect”)。在进行查询时,如何使用Hibernate以编程方式关闭它?

2 个答案:

答案 0 :(得分:6)

事实上,它应该是另一种方式。您可以在映射中将其关闭,并在查询中使用“fetch”在特定用例上激活它。

这就是Hibernate团队看待它的方式。在Hibernate中没有办法创建一个为属性指定“no-fetch”的请求......

答案 1 :(得分:0)

我有一种情况,由于历史原因,在几个一对多依赖项之间急切地获取。多年来,许多地方依赖它,因此很难关闭。 但是在某些情况下,急切的提取会阻碍:对于表中的每个较大的选择,它会为每个对象的每个集合产生100个小子查询。 我找到了解决这个问题的方法,并没有真正覆盖了渴望的提取,但对我来说同样有用:只需创建一个查询即可同时执行所有子提取。这将对数据库进行1次物理查询,而不是让hibernate遍历依赖图并生成100个查询。

所以我换了

Query q = session.createQuery("from Customer c");

通过

Query q = session.createQuery("from Customer c " +
            "left join fetch c.vats v " +
            "left join fetch v.klMemos bk " +
            "left join fetch bk.ferryKlMemos");

1客户有很多增值税号,1个增值税号有很多klmemos等等。旧的情况将首先仅获取客户,然后休眠将开始逐个获取每个依赖的集合。 第二种形式将在一个本机查询中加载所有内容,而hibernate将找到填充对象缓存中的eager集合所需的全部内容。 希望它对某人有帮助。 注意:我仍然认为你应该尽量避免急切的提取; - )