Spring Data JPA:保存含嵌套实体的A后,无需B仓库获取完整B实体?
关联实体保存后关联对象不完整的解决方案
实体类定义
类A
class A { Long id; @ManyToOne B b; }
类B
class B { Long id; @ManyToOne C c; }
类C
class C { Long id; }
问题场景
当保存一个内部仅携带数据库已存在ID的B对象的A对象时,调用A仓库的save方法返回的A对象中,关联的B对象缺少其关联的C实体。请问是否可以不通过B仓库查询获取完整的B对象?
可行方案
当然可以不用B仓库查询,有几种直接的处理方式:
使用EntityManager的getReference方法
直接通过EntityManager获取B的代理对象,这个代理不会立即查询数据库,当你访问B的关联属性(比如C)时,Hibernate会自动触发懒加载获取完整数据。示例代码:// 假设已注入EntityManager B bProxy = entityManager.getReference(B.class, existingBId); A a = new A(); a.setB(bProxy); A savedA = aRepository.save(a); // 此时访问savedA.getB().getC()会自动加载C实体使用JPA动态实体图(EntityGraph)
在A仓库的save方法上指定EntityGraph,强制加载B及其关联的C。示例代码:@EntityGraph(attributePaths = {"b.c"}) @Override A save(A entity);这样调用save方法返回的A对象会包含完整的B和关联的C。
修改关联Fetch模式为EAGER(谨慎使用)
把B类中@ManyToOne注解的fetch属性改为FetchType.EAGER,保存A时会自动加载B的关联C实体。但这种方式会导致每次查询B都强制加载C,可能引发性能问题,仅适合业务场景确实需要始终加载C的情况:class B { Long id; @ManyToOne(fetch = FetchType.EAGER) C c; }
内容的提问来源于stack exchange,提问作者Mahmoud Reda
相关产品推荐
相关产品推荐

