我有模型类别。它可能具有父类别和子类别列表。我写这个问题是因为找不到实体与自己相关的案例。
我尝试像这样实现它:
@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。但我不确定这是不是一个好的做法。 但是,如果我有一个案例,当我需要一个类别时,我确实需要将其与父级一起发送到用户界面。 @JsonIgnore 可以产生这个吗?
最佳答案
@damienMiheev 我也遇到了同样的问题,但是调试问题 1 或半小时我发现
即使您的父字段延迟加载,当您的字段的自动 JSON 生成 getter 被调用时,它正在获取值,这会创建一些循环执行。 因为它先获取父级,然后获取子级,然后再次为子级集合中的每个子级获取父级,并继续此过程直到 StackOverflow。
这是您问题的解决方案
您应该从 json 生成中排除“父级”,例如您可以将该字段标记为@JsonIgnore。 您也不应该在 hashCode()、equals() 和 toString() 方法中包含父级和子级。
关于java - 为什么 FetchType.Lazy 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38618101/