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

为什么不FetchType。懒惰的工作?

郑燕七
2023-03-14

我有模型类别。它可能有父类别和子类别列表。我写这个问题是因为找不到实体和自己相关的情况。

我试图这样实现它:

@Entity
public class Category {
@Id
private String id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Category parent;

@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
private List<Category> subcategories = Lists.newArrayList();
}

我保存实体,如:

Category parent = new Category();
parent.setName("parent");

Category child1 = new Category();
child1.setName("child1");
child1.setParent(parent);

parent.getSubcategories().add(child1);

categoryPersistence.save(parent);

我希望看到这样的情况:

parent {
id
parent: null
childs {
   child {
      id
      parent: ...lazy loading exception...
      childs: null
   }
}
}

但是在子模型中,我有递归循环。如何防止它?

是的,我也使用了@JsonIgnore。但是我不确定这是不是一个好的做法。但是如果我有一个案例,当我需要一个类别时,我真的需要将它发送给父母的UI。@JsonIgnore可以产生这个吗?

共有1个答案

史懿轩
2023-03-14

@damienMiheev我也遇到过同样的问题,但调试问题1或半小时我就明白了

即使您的父字段延迟加载,当您字段的自动JSON生成getter被调用时,它正在获取值,这会创建一些循环执行。因为它正在获取父级,然后获取子级,然后再次获取子集合中每个子级的父级,并继续此过程,直到StackOverflow。

这是你的问题的解决方案

您应该从json生成中排除“父”the,例如您可以将该字段标记为@JsonIgnore。您也不应该在hashCode()、equals()和toString()方法中包含父级和子级。

 类似资料:
  • 我的问题是:当我对父实体(合同)执行查询时,在子实体(ContractHeader)上应用过滤器并使用FetchType。LAZY,LAZY规则应用正确,但当我尝试访问子列表(ContractHeader)时,过滤器不会应用于子对象,所有子对象都加载到列表中。有人能帮我回答这个问题吗?过滤器应与fetchtype一起使用。懒惰? 有人成功地实施了这样的事情吗? Tks! 我拥有以下实体: 在调用查

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

  • 我创建了一个jHipster示例应用程序(url:http://jhipster.github.io/creating_an_app.html),使用实体子生成器,我创建了一个事件实体,当我检索所有时,该实体与EventImages、EventTickets和EventQuestions具有一个域关系(应用程序在本地计算机上运行,api url:http://127.0.0.1:8080/api/

  • 我读了很多关于Singleton的文章,其中大多数作者都说Java中Singleton的这种变体: 他并不懒惰(那么渴望)。 但是我不明白为什么,constructor只在类初始化时被调用。我知道几个可能触发类初始化的原因: 使用与构造函数(但在这种情况下,构造函数是私有的)。 访问或设置静态字段(此处为私有)。 使用静态方法。 带反射:. 因此,在这里,我们的对象将仅在使用静态方法(我猜它仍然是

  • 我正在尝试使用实体图来触发加载的惰性集合,但不幸的是,实体图也会触发所有嵌套集合。我正在使用spring-data-jpa-entity-graph库在运行时创建实体图。 带有 JPA 存储库的 Spring 服务: 在这种情况下,服务还为每辆车返回零件收集,但我只想获取每个品牌的车辆收藏的品牌列表。 我们如何在第一级触发加载懒惰集合(仅限品牌车辆-没有车辆零件)?

  • 问题内容: 我读了很多关于Singleton的文章,其中大多数作者都说Java中Singleton的这种变体: 不是LAZY ( 然后 是 EAGER )。 但是我不明白为什么,构造函数只会在类初始化时被调用。我知道几个可以触发类初始化的原因: 与构造函数一起使用(但在这种情况下,构造函数是私有的)。 访问或设置静态字段(此处为私有)。 使用静态方法。 带有反射:。 因此,这里我们的对象将仅在使用