JPA的n+1问题是与@OneToMany、@ManyToOne有关,还是两者均相关?
JPA n+1问题与
@OneToMany/@ManyToOne的关联性说明 结论:n+1问题和两个注解都相关,两种注解的使用场景均有可能触发该问题
n+1问题的核心表现为:执行1次主实体查询得到N条主数据后,后续会额外生成N条针对关联实体的单条查询语句,总查询数为1+N,严重损耗数据库访问性能。
两种注解的触发场景说明
@OneToMany场景(查询的实体包含被@OneToMany标注的集合类型字段)
该注解默认加载策略为LAZY,以User实体中存在@OneToMany标注的List<Order> orders字段为例:- 若先执行全量
User查询得到N条用户数据,后续遍历用户列表访问orders属性时,会为每个用户单独生成1条订单查询语句,触发n+1 - 若手动将加载策略改为
EAGER,则哪怕不需要访问订单属性,执行User查询时就会自动触发n+1问题
- 若先执行全量
@ManyToOne场景(查询的实体包含被@ManyToOne标注的字段)
该注解默认加载策略为EAGER,以Order实体中存在@ManyToOne标注的User user字段为例:- 默认配置下执行全量
Order查询得到N条订单数据时,会自动为每条订单单独生成1条关联用户的查询语句,直接触发n+1 - 若手动将加载策略改为
LAZY,后续遍历订单列表访问user的属性时,同样会触发n+1问题
- 默认配置下执行全量
内容的提问来源于stack exchange,提问作者J.J. Beam
相关产品推荐
相关产品推荐

