1. Hibernate N+1 查询问题的成因,懒加载关联对象导致 1+N 次 SQL?
请说明 Hibernate N+1 查询问题的成因,以及懒加载关联对象为何导致 1+N 次 SQL?
- N+1 问题的定义与成因
- 懒加载与关联对象
- 触发条件
Hibernate 的 N+1 查询问题指:查询出 N 条父记录后,在访问每条父记录的懒加载关联对象时,又各自触发一次 SQL 查询,总共产生 1(查父)+ N(查每条父的关联)次 SQL。成因是:实体关联默认懒加载(lazy),当批量查询父实体后,遍历访问子关联(如 parent.getChildren())时,Hibernate 对每个父实体单独发一条查询子表的 SQL,造成 N+1。典型场景如 session.createQuery("from Parent where ...") 查到 N 个 Parent,再循环访问 getChildren()。N+1 导致大量往返、性能急剧下降,尤其在关联层级深或 N 大时。
N+1 的本质是"懒加载 + 逐条访问"导致的查询放大。解决方向是"一次取齐"(JOIN、批量抓取、子查询)或"避免遍历访问懒加载属性"。识别 N+1 常用开启 SQL 日志打印 count 观察。