话不多话,直接贴代码。
@JsonIgnore
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="pid")
private Menu parent;
//@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true,fetch=FetchType.LAZY,mappedBy="parent")
@OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL,mappedBy = "parent")
@OrderBy("position asc")
private List<Menu> children;
public Menu getParent() {
return parent;
}
public void setParent(Menu parent) {
this.parent = parent;
}
public List<Menu> getChildren() {
return children;
}
public void setChildren(List<Menu> children) {
this.children = children;
}
@Override
public String toString() {
return "Menu [id=" + id + ", parent=" + parent+ ", children=" + children+ ", name=" + name + ", uri=" + uri + ", style="
+ style + ", position=" + position + ", description="
+ description + ", enable=" + enable + "]";
}
报错如下:
原因:内存溢出,从经验来看肯定是哪里出现了死循环了。
按照这个思路去分析,最终定位到 Menu对象中子Menu集合List<Menu> children ;
可这种自表关联查询的注解写法都是正确的,菜单对象中父菜单id对应多个子菜单。
重点来了,请关注标红的报错位置:
在Menu类的toString方法里面内存溢出,或者说死循环了。这就好理解了,因此children集合
里面是Menu===>Menu里面有children集合===>children集合里面是Menu。。。。。。
一直死循环了。
解决:
将toString方法中children去掉
@Override
public String toString() {
return "Menu [id=" + id + ", parent=" + parent + ", name=" + name + ", uri=" + uri + ", style="
+ style + ", position=" + position + ", description="
+ description + ", enable=" + enable + "]";
}