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
方法有关,但我不确定这里有什么问题。下面是 POJOs
或 entities
人
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()
,它仍然继续方法堆栈溢出。
我是 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
方法有关,但我不确定这里有什么问题。下面是 POJOs
或 entities
人
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()
,它仍然继续方法堆栈溢出。