我是 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.StackOverflowError
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
时,它会按预期运行。根据堆栈跟踪,它似乎与 toString
方法有关,但我不确定是什么问题在这里。下面是POJO
或实体
人
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()
的实现,它包含字符串连接中的 persons
对象。它再次调用 Person# toString()
,它继续下去,方法堆栈仍然溢出。
关于java - 查询 HQL 查询结果时 PersistentBag.toString() stackoverflow 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55560638/