使用List集合使Hibernate抛出stackoverflow错误

时间:2014-07-31 19:24:44

标签: java hibernate jpa

我有三个域对象,一个父对象有两个子对象。父对象与两个子对象具有多对一关系,因此两个子对象都具有父对象的集合,而父对象具有对两个子对象的引用。

父母

public class Parent {

    private OtherChild otherChild;
    private SomeChild someChild;

    /*Other methods and properties*/


    @ManyToOne(fetch = FetchType.EAGER)
    public SomeChild getSomeChild() {
        return this.someChild;
    }

    public void setSomeChild(SomeChild someChild) {
        this.someChild = someChild;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    public OtherChild getOtherChild() {
        return this.otherChild;
    }

    public void setOtherChild(OtherChild otherChild) {
        this.otherChild = otherChild;
    }
}

孩子们

public class SomeChild {

    private List<Parent> parents;

    /*Other methods and properties*/

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "someChild")
    public List<Parent> getParents() {
        return parents;
    }

    public void setParents(List<Parent> parents) {
        this.parents = parents;
    }
}

我正在使用带有JPA注释的hibernate将此设置持久化到数据库,但是当任何子项中的父项集合是一个列表时,我在尝试获取父项时遇到堆栈溢出错误( parent都标记为FetchType.EAGER)。当我将获取更改为FetchType.LAZY时,获取父项工作正常但仅提取任何子项仍然会导致堆栈溢出错误,因为(从SQL看), hibernate仍尝试获取父项儿童中父母的集合被标记为懒惰获取

在这个父项的普通用法中,它总是需要获取其子项,以便它们的映射在父对象中标记为fetch = FetchType.EAGER。我已经尝试轮流禁用每个子节点的急切获取但是只在获取父节点时删除了错误但是获取任何子节点仍然导致SO错误。到目前为止,我唯一的解决方案是更改父项集合的类型:{list}中的两个子项中的List<parent> parents。但是我需要将该集合列为可能原因的列表。简而言之,

  • 为什么在子对象中有一个列表会导致堆栈溢出错误
  • 如何在子节点中创建父对象列表,并且仍然渴望从父对象中获取子对象

0 个答案:

没有答案