Java 为什么不抓取类型。懒惰的工作?

Java 为什么不抓取类型。懒惰的工作?,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我有模特类别。它可能有父类别和子类别列表。我写这个问题是因为找不到实体和他自己相关的情况 我试着这样实现它: @Entity public class Category { @Id private String id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parent_id") private Category parent; @OneToMany(mappedBy = "parent", fetch = FetchT

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

我试着这样实现它:

@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();
}
我希望看到这样的情况:

parent {
id
parent: null
childs {
   child {
      id
      parent: ...lazy loading exception...
      childs: null
   }
}
}
但在文件父对象的子模型中,我有递归循环。 如何预防

是的,我也用了@JsonIgnore。但我不确定这是否是一种良好的做法。
但如果我有一个案例,当我需要一个类别时,我真的需要将它发送到UI和家长。@JsonIgnore能产生这样的结果吗?

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

即使父字段延迟加载,也会调用字段的自动JSON生成getter来获取值,从而创建一些循环执行。 因为它先获取父对象,然后获取子对象,然后再获取子对象集合中每个子对象的父对象,并继续此过程,直到堆栈溢出

这是你问题的解决办法

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

在获取实际对象的方法中,可以在参数中包含一个名为
referenced
的布尔值,然后在对象调用其自身时将其设置为true。然后在构造过程中,如果(!referenced){…进行检查,这样可以避免递归循环,只获取一次引用。
parent {
id
parent: null
childs {
   child {
      id
      parent: ...lazy loading exception...
      childs: null
   }
}
}