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

我试图这样实现:

@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可以产生这个吗?

最佳答案

@damienMiheev我也遇到过同样的问题,但是调试了我发现的1或半小时的问题

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

这是您的问题的解决方案

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

10-07 17:00