PersistentBag.toString () ошибка stackoverflow при запросе результата HQL-запроса - PullRequest
1 голос
/ 07 апреля 2019

Я новичок в 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, но я не уверен, в чем здесь проблема. Ниже приведены 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 + "]";
        }

Может кто-нибудь, пожалуйста, помогите.

1 Ответ

1 голос
/ 07 апреля 2019

Вы столкнулись с проблемой, когда Person#toString вызывает Company#toString, а Company#toString снова вызывает Person#toSting.

Итак, что происходит, когда Person # toString вызвал его и вызвал приведенное ниже определение toString:

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

Теперь можно видеть, что вы загрязнили компанию, а это означает, что ваше заявление о возврате фактически становится "Person [id=" + id + ", name=" + name + ", company=" + company.toString() + "]";. Таким образом, он вызывает Company # toString (), теперь смотрите реализацию Company#toString(), в которой содержится persons объект в конкатенации строк. Что снова вызывает Person#toString(), и он продолжает работать, но стек методов переполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...