我正在尝试使用实体图来触发懒惰集合的加载,但不幸的是,实体图还触发了所有嵌套集合。我正在使用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存储库的春季服务:
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();
}
}
在这种情况下,还返回每辆车的零件收集
我们如何才能触发仅在第一级(只有品牌的车辆 - 没有车辆的零件(上加载懒惰的集合?
我也有同样的问题。就我而言:春天和休眠的行为正确,但是我可以看到,未使用(懒惰(字段是从SQL查询的。
当您使用字段时,它们将通过SQL加载。
IAM使用Lombok和@EqualsAndHashCode.Exclude
和@ToString.Exclude
有助于预防。
在您的情况下:添加DTO层。不要将自己归还实体。
或使用@JsonIgnore
注释忽略字段。