PersistentBag.toString() 查询HQL查询结果时出现stackoverflow错误

PersistentBag.toString() stackoverflow error while querying the result of HQL query

我是 Hibernate 的初学者,正在尝试实现 HQL 查询之一

Query q= em.createQuery("select p from Person p join p.company c");
        List<Person> l = q.getResultList();
        System.out.println(l.get(0));

当我运行上面的代码时,我得到以下错误:

Exception in thread "main" java.lang.WhosebugError
    at java.lang.StringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.<init>(Unknown Source)
    at hibernate5.testing.onetomany.Person.toString(Person.java:71)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at java.util.AbstractCollection.toString(Unknown Source)
    at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:527)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at hibernate5.testing.onetomany.Company.toString(Company.java:72)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)

然而,当我注释掉 sysout 时,它 运行 根据堆栈跟踪显示为 expected.As 它似乎与 toString 方法有关,但我不确定这里有什么问题。下面是 POJOsentities

getters and setters


    @Override
public String toString() {
    return "Person [id=" + id + ", name=" + name + ", company=" + company + "]";
}

公司

 getters and setters


        @Override
        public String toString() {
            return "Company [id=" + id + ", name=" + name + ", persons=" + persons + "]";
        }

有人可以帮忙吗。

您遇到的问题是 Person#toString 调用 Company#toString 并且 Company#toString 再次调用 Person#toSting.

所以,当 Person#toString 调用它时,正在发生的事情是调用下面的 toString 定义:

    @Override
public String toString() {
    return "Person [id=" + id + ", name=" + name + ", company=" + company + "]";
}

现在可以看到你也污染了公司这意味着你的return声明实际上变成了"Person [id=" + id + ", name=" + name + ", company=" + company.toString() + "]";。所以,它调用 Company#toString() 现在看 Company#toString() 的实现,它在字符串 concatination.Which 中包含 persons 对象,再次调用 Person#toString() ,它仍然继续方法堆栈溢出。