Сущность ObjA имеет отношение "один ко многим" с другой сущностью ObjB.

Следующий код в моем дао работает должным образом:

Session session = getSessionFactory().openSession();
Criteria criteria = session.createCriteria(ObjA);
//......
criteria.setReadOnly(true);
criteria.setCacheable(false);
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
List<ObjA> results = criteria.list();

Чтобы оптимизировать приведенный выше код (чтобы избежать OutOfMemoryException), я попытался использовать ScrollableResults вместо criteria.list():

//same as above code..
ScrollableResults results = criteria.scroll(ScrollMode.FORWARD_ONLY);
while(results.next()){
    ObjA a = results.get()[0];
    session.evict(a); 
    //store 'a' in a collection
}

Однако, используя этот подход, я получил отдельные строки для каждого ObjB, соответствующего ObjA (в некотором смысле, повторяющиеся корневые объекты). Я попытался не удалить объект, но все равно остались повторяющиеся строки.

Есть идеи, что я здесь делаю неправильно / не хватает?

P.S. Версия гибернации - 3.5.1-ФИНАЛЬНАЯ

0
user2780757 28 Апр 2018 в 21:26

1 ответ

Лучший ответ

Похоже, это нескончаемая ошибка / необходимое улучшение в спящем режиме. В итоге я использовал fetch="select" для всех соединений "один ко многим".

Хотя это увеличило количество запросов к базе данных, но удалило повторяющиеся корневые объекты.

0
user2780757 1 Май 2018 в 18:12