“问题”并不是真正的问题,而是关于 ORM 的工作方式。 Hibernate 创建了所谓的嵌套查询如果您访问这样的协会。
你是对的,在这两种情况下都会执行相同的查询,切换FetchType
你的映射来自LAZY
to EAGER
仅调度附加 (n+1) 个查询的执行。
假设您有许多公司,所有公司都有员工,在这两种情况下都会执行类似的查询(至少一次):
select ... from company company0_
select ... from employee employee0_ where employee0_.cmp_id=?
执行第一个是为了获取所有公司,第二个是为每个公司执行一次。
例如:拥有许多员工的 3 个公司 (N) 将执行第一个 select 一次,三个嵌套 select = 3+1 = 4 个查询。
之间的区别EAGER
and LAZY
就在这个时间点上,您通常无法避免数据库访问,因为您仍然需要数据。和LAZY
附加查询将被推迟,直到您迭代员工集合为止。但请记住,这只是一个提示,并非每个数据库驱动程序都支持延迟加载。
如果你真的知道你总是需要这些数据,你可以写一个FETCH JOIN
一次性查询并接收所有需要的数据:
Select c from Company c JOIN FETCH c.employee e
这将执行如下查询:
select ... from company company0_ inner join employee employee1_ on company0_.cmp_id=employee1_.cmp_id
这将避免第二次数据库访问。为了在您的测试中验证这一点,也许数据源代理项目是适合你的。