我有模特类别。它可能具有父类别和子类别列表。我写这个问题是因为找不到与自己有关的实体的案例。
我试图这样实现:
@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()方法中包含父项和子项。