Многие возвращаемые записи вызывают переполнение стека в Hibernate - PullRequest
1 голос
/ 12 декабря 2008

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

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

Ответы [ 3 ]

0 голосов
/ 06 января 2009

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

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

0 голосов
/ 19 мая 2010

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

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

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

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

...