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

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

result.addAll(getCurrentSession().createCriteria(User.class)
    .add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE))
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
    .list());
12.12.2008 08:57:53
stackoverflow в stackoverflow +1
Martin 31.01.2010 18:54:39
сколько точно много ? В любом случае, вам может быть лучше использовать HQL, а не критерии API в этом случае. Если ваше условие where определяется во время выполнения, критерии api полезны, в противном случае предпочтительным является HQL. Вы можете зарегистрировать HQL-запросы в файлах .hbm или даже с помощью аннотаций, и они компилируются (эффективно проверяются) при начальной загрузке привязок.
arajashe 5.11.2013 09:03:14
3 ОТВЕТА

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

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

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

0
26.12.2008 21:06:38

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

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

0
6.01.2009 03:19:53

Это поможет точно узнать, какие повторные запросы вы видите. Как отмечали другие, мы просто размышляем, не видя ваших отображений. Вы можете столкнуться с нетерпеливым поиском 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 здесь

0
14.11.2016 23:47:08