7

我在将关联映射到急切加载的集合(lazy="false" fetch="subselect")。当我进行查询时,如何使用 Hibernate 以编程方式将其关闭?

4

2 回答 2

8

事实上,它应该是相反的。您在映射中将其关闭,并在查询中使用“获取”在特定用例上激活它。

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

于 2009-09-03T10:52:55.990 回答
0

我有一种情况,由于历史原因,我确实渴望在几个一对多的依赖项之间进行获取。多年来,许多地方都依赖它,因此很难关闭。然而,在某些情况下,急切的获取会造成阻碍:对于表上的每个较大的选择,它会为每个对象的每个集合生成 100 个小子查询。我找到了解决这个问题的方法,并不是真正覆盖急切的提取,但对我来说同样有用:只需创建一个一次性执行所有子提取的查询。这将对数据库进行 1 次物理查询,而不是让休眠模式遍历依赖关系图并产生 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 将在对象缓存中找到填充急切集合所需的所有内容。希望它可以帮助某人。注意:我仍然认为你应该尽量避免急切的获取 ;-)

于 2013-04-25T07:07:16.353 回答