Многие возвращенные записи вызывают переполнение стека с Hibernate

Если много возвращаемых записей из БД. Это вызовет проблему с переполнением стека. User - это класс, который имеет отношение «один ко многим» (с 3 другими классами). Когда я распечатал SQL, я обнаружил, что система много раз выполняет один и тот же запрос, чтобы получить данные из БД. Кто-нибудь знает, в чем проблема?

result.addAll(getCurrentSession().createCriteria(User.class)
    .add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE))
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
    .list());

stackoverflow в stackoverflow +1

Martin 31.01.2010 21:54

сколько именно много? В любом случае, в этом случае вам может быть лучше использовать HQL, а не api критериев. Если ваше предложение where определяется во время выполнения, используется api критериев, в противном случае предпочтительнее HQL. Вы можете зарегистрировать запросы HQL в файлах .hbm или даже с помощью аннотаций, и они компилируются (эффективно проверяются) при первоначальной загрузке привязок.

arajashe 05.11.2013 13:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
1 243
3

Ответы 3

Если вы ищете пользователей с именем tom только, тогда у него не должно закончиться память, если у вас нет большого количества% tom% hehe.

Вы можете попытаться установить для него ограничение, чтобы он возвращал только те, которые вы можете обрабатывать за раз.

Я не уверен, что кто-то сможет понять, почему он выполняет тот же запрос без дополнительной информации.

Вы случайно не используете EntityMode.DOM4J? (т.е. Hibernate -> XML вместо Hibernate -> POJO). Вложенные отношения не работают без настройки, потому что генератор XML бесконечно рекурсирует там, где POJOS обрабатывает их нормально.

Я могу уточнить, но если вы не используете DOM4J, проблема в другом.

Это поможет точно узнать, какие повторяющиеся запросы вы видите. Как отмечали другие, мы просто размышляем, не видя ваших сопоставлений. Возможно, вы столкнулись с нетерпеливой загрузкой Hibernate. Здесь Hibernate пытается загрузить весь граф объектов для каждого пользователя (и его адреса, телефона, домашних животных и т. д.), Соответствующего общему имени, содержащему запрос «tom». Попробуйте отключить активную выборку по умолчанию для свойств пользователя в файлах сопоставления Hibernate или аннотациях, а затем выполните следующие действия:

Допустим, вы получаете множество повторяющихся запросов, просматривающих таблицы USER_ADDRESS (hibernate property "addresses"), USER_PHONE (property "phones") и USER_PET (property "pets"). Используйте следующие вызовы критериев, чтобы объединить эти атрибуты в исходный запрос и уменьшить количество повторяющихся запросов. Hibernate знает, как разбить эти столбцы на отдельные объекты. Вы также можете попробовать добавить максимальное количество возвращаемых результатов.

Criteria myUsers = getCurrentSession().createCriteria(User.class);
myUsers = myUsers.add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE));
myUsers.createCriteria("addresses"); // NEW
myUsers.createCriteria("phones"); // NEW
myUsers.createCriteria("pets"); // NEW
myUsers.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
myUsers.setMaxResults(100); // NEW
result.addAll(myUsers.list());

Подробнее читайте в разделах 15.4-15.6 здесь.

Другие вопросы по теме