当前位置: 首页 > 知识库问答 >
问题:

为什么Hibernate实体图获取嵌套的懒惰集合

长孙鸿振
2023-03-14

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

}

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

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

共有1个答案

钱稳
2023-03-14

我遇到了同样的问题。在我的情况下:Spring和Hibernate的行为正确,但我可以看到,未使用的(懒惰的)字段是从sql中查询的。

当您使用这些字段时,它们将通过sql加载。< br >我正在使用lombok和< code>@EqualsAndHashCode。Exclude和< code>@ToString。Exclude有助于防止这种情况。

在你的情况下:添加一个DTO层。不要返回实体本身。< br >或者使用< code>@JsonIgnore批注来忽略字段。

 类似资料:
  • 我认为这个问题本质上是关于可变性背景下的懒惰是什么。 在Scala编程(或文档)中,他们给出了如何在不可变和可变集合上使用视图的示例。在该节中,它们指出 视图并不复制这些元素,它只是提供对它们的引用。 我明白为什么我们会得到那个答案。但是transformer有什么懒惰的呢?我把懒惰理解为只在需要时才计算值(就像不可变集合的例子一样)。但是,中的值从不计算,它们只是对中的值的引用,即使在调用之后也

  • 问题内容: 我有的: 有什么问题: 问题是,在会话关闭后,我无法拉动惰性收集。但是我也无法在 proceed 方法中关闭会话。 什么解决方案(粗略解决方案): a)在会话关闭之前,强制hibernate以拉动惰性集合 .... b)也许更轻松的方法是使用注释 题: 什么是最佳做法/常见方式/更轻松的方式?意味着将我的对象转换为JSON。 问题答案: 在内部使用初始化惰性对象。 现在,在Transa

  • 我有模型类别。它可能有父类别和子类别列表。我写这个问题是因为找不到实体和自己相关的情况。 我试图这样实现它: 我保存实体,如: 我希望看到这样的情况: 但是在子模型中,我有递归循环。如何防止它? 是的,我也使用了@JsonIgnore。但是我不确定这是不是一个好的做法。但是如果我有一个案例,当我需要一个类别时,我真的需要将它发送给父母的UI。@JsonIgnore可以产生这个吗?

  • 我试着把我的头绕到相对较新的img属性“加载”上。 我知道,如果img具有load=“lazy”属性,那么它会告诉支持该属性的浏览器,在接近视口时可以加载该属性。 那么为什么不总是设置loading=“lazy”?那些立即出现在屏幕上的图像无论如何都会被渲染,因为它们已经在视口中了。因此,在这种情况下,基本上忽略了load=“lazy”。 在这个演示https://mathiasbynens.be

  • 我实现了两个 entites。规则实体和 RestCall 实体如下所示: RuleEntity RestCallEntity 我在 json 终结点中收到一条规则。比我将收到的 json 规则转换为规则实体并调用 当我只是更改规则的名称时,更新工作正常。但是当我更改它的名称时,它看起来像Hibernate尝试创建一个新的重新调用,即使它已经有一个ID。我得到以下异常。 原因:ruleentity

  • 我想知道是否有办法微调JPA/Hibernate以管理以下用例。我有以下对象模型: 然后我执行以下代码: 我想要实现的是: > 根据用例调整Hibernate,即不更改实体类; 使Hibernate执行两个查询: 上面的代码片段与Child-Sunder lazy fetch的基本行为是: (1)执行对实体的一个查询; (2)对实体的所有实体执行一个查询; (3)n个查询,每个实体一个。 通过阅读