3

我正在尝试使用实体图来触发延迟集合加载,但不幸的是实体图也会触发所有嵌套集合。我正在使用 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();
    }

}

在这种情况下,服务还返回每辆车的零件收集,但我只想获取每个品牌的车辆收集的品牌列表。

我们如何触发仅在第一级加载惰性集合(仅品牌车辆 - 没有车辆零件)?

4

1 回答 1

1

我有同样的问题。在我的例子中: Spring 和 hibernate 行为正确,但我可以看到,未使用的(惰性)字段是从 sql 中查询的。

当您使用这些字段时,它们将通过 sql 加载。
我正在使用 lombok 并且@EqualsAndHashCode.Exclude有助于@ToString.Exclude防止这种情况发生。

在您的情况下:添加一个 DTO 层。不要返回实体本身。
或者使用@JsonIgnore注解忽略字段。

于 2021-05-25T16:42:49.607 回答