Spring Data JPA中getById与getReferenceById行为差异咨询
Spring Data JPA中getById与getReferenceById的行为差异
核心差异:底层实现逻辑不同
- getReferenceById:直接调用JPA规范的
EntityManager.getReference()方法,返回目标实体的代理对象,不会立即执行数据库查询。只有当你访问代理的非ID属性时,才会触发查询;若目标对象不存在,此时才会抛出EntityNotFoundException,方法调用本身不会报错。 - getById:实现逻辑随Spring Data JPA版本变化。在部分版本中,它会直接调用
findById().orElseThrow(),执行立即查询,一旦目标对象不存在,调用方法时就会抛出EntityNotFoundException;在2.3.x及之后的新版本中,它是getReferenceById的别名,行为与后者一致。
你遇到该现象的原因
你当前使用的Spring Data JPA版本中,getById采用了立即查询的实现:调用时直接触发数据库SELECT语句,找不到数据就立刻抛异常;而getReferenceById遵循延迟加载逻辑,仅生成代理对象,不即时查询数据库,因此方法调用阶段不会报错。
适用场景
- 仅需实体ID用于外键关联、无需访问其他属性时,用
getReferenceById更高效,避免不必要的数据库交互; - 需要立即确认实体存在并获取完整数据时,用
getById(或直接使用findById().orElseThrow())更合适。
内容的提问来源于stack exchange,提问作者Mateusz Sobczak
相关产品推荐
相关产品推荐

