症状
事务结束后访问映射关联会抛 LazyInitializationException: could not initialize proxy - no Session。它通常出现在控制器、视图或 JSON 序列化层,而同一数据在服务方法内加载正常。实体离开了持久化上下文,其懒加载关联无法再按需初始化。
诊断
定位关联被访问的位置;在事务内用 join fetch 或 entity graph 抓取;或改为在事务内映射为 DTO。
grep -rn "getItems\|getOrders()\|@OneToMany\|@ManyToOne" src
根因
某懒加载关联在其持久化上下文关闭后被访问,Hibernate 没有会话可执行加载查询,于是抛出 LazyInitializationException。
修复
在事务内通过 join fetch 或 entity graph 抓取所需关联,或在事务关闭前把实体映射为 DTO 返回。让所需数据在会话可用时全部加载完成。
验证
重复该请求确认关联加载不再抛错,且响应含预期的关联数据。加载正确而非仅仅不抛错才算 fetch 策略正确。
常见陷阱
开启 open-session-in-view 会掩盖问题并延长连接占用;应显式抓取所需关联。