JPA OneToMany并通过单个查询获取孩子

时间:2013-05-01 17:47:45

标签: performance hibernate jpa

我注意到在hibernate中,它一次查询实体的子集合。因此,例如,我有一个Person实体与PhoneNumber的OneToMany关系以及与EmailAddress的OneToMany关系。如果我对返回1,000个人的Person实体进行简单查询,那么hibernate将对EmailAddress进行1,000次查询,对PhoneNumber进行1,000次查询。让我们忘记一分钟的渴望或懒惰,并假设我将访问每个人的电话和电子邮件集。

这似乎是一个天真的实现。有没有一种简单的方法可以改变这一点,因此只有1个查询到PhoneNumber,只有1个查询到EmailAddress?这些应放入由其Person外键键入的映射中,以便通过Person getter方法轻松检索它们。

在执行Person查询之前,除了对会话缓存中的电子邮件和电话号码进行强制查询外还有什么想法吗?

TIA,如果您需要其他数据,请与我们联系。

1 个答案:

答案 0 :(得分:2)

除了自己进行查询外,您可以简单地启用批量提取,如the documentation中所述:

  

您还可以启用批量提取集合。例如,如果每个Person都有一个懒惰的Cats集合,并且当前在Session中加载了10个人,则遍历所有人将生成10个SELECT,每次调用getCats()一个。如果在Person的映射中为cats集合启用批量提取,Hibernate可以预取集合: