spring - 为什么休眠实体图获取嵌套的惰性集合
问题描述
我正在尝试使用实体图来触发延迟集合加载,但不幸的是实体图也会触发所有嵌套集合。我正在使用 spring-data-jpa-entity-graph 库在运行时创建实体图。
@Entity
public class Brand implements Serializable {
@OneToMany(mappedBy = "brand", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<Vehicle> vehicles;
}
@Entity
public class Vehicle implements Serializable {
@ManyToOne
@JoinColumn(name = "brand_id")
private Brand brand;
@OneToMany(mappedBy = "vehicle", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<VehiclePart> parts;
}
@Entity
public class VehiclePart implements Serializable {
@ManyToOne
@JoinColumn(name = "vehicle_id")
private Vehicle vehicle;
}
带有 JPA 存储库的 Spring 服务:
public interface BrandsRepository extends EntityGraphJpaRepository<Brand, Long> {
Page<Brand> findAll(Pagable pagable, EntityGraph entityGraph);
}
@Service
public class BrandsService {
public List<Brand> find() {
return repository.findAll(PageRequest.of(0, 10, Sort.by(Sort.Direction.ASC, "id")), EntityGraphUtils.fromAttributePaths("vehicles")).getContent();
}
}
在这种情况下,服务还返回每辆车的零件收集,但我只想获取每个品牌的车辆收集的品牌列表。
我们如何触发仅在第一级加载惰性集合(仅品牌车辆 - 没有车辆零件)?
解决方案
我有同样的问题。在我的例子中: Spring 和 hibernate 行为正确,但我可以看到,未使用的(惰性)字段是从 sql 中查询的。
当您使用这些字段时,它们将通过 sql 加载。
我正在使用 lombok 并且@EqualsAndHashCode.Exclude
有助于@ToString.Exclude
防止这种情况发生。
在您的情况下:添加一个 DTO 层。不要返回实体本身。
或者使用@JsonIgnore
注解忽略字段。
推荐阅读
- r - RStudio 查看器错误:未找到“会话/viewhtml ....”
- mysql - pdo 准备好的语句以无效的参数号退出
- azure - Azure 容器实例的静态 IP 地址
- impala - 在 Superset 上启用 Impala 模拟
- python - 在数据框列中选择并显示某个值
- javascript - 带有搜索和输入的 HTML 下拉框
- scala - 如何使用 Ignite 创建我自己的 CacheStore 以在二进制模式下存储值 (setStoreKeepBinary(true))
- security - GRPC 中不同端点的多个 SSL/TLS 证书
- javascript - 重组对象数组的最佳方法
- pyinstaller - Pyinstaller:运行 .exe 时找不到模块