Использует ли итеративный метод сохранения данных пружины пакетную операцию и возвращает результаты в том же порядке? - PullRequest
1 голос
/ 11 ноября 2019

У меня есть список сущностей, которые мне нужно сохранить, используя данные весны. Некоторые из них уже имеют идентификаторы, а некоторые нет. Прочитав другие подобные вопросы, я понял, что метод репозитория save(Iterable<S> iterable) использует ArrayList внутри, поэтому результат всегда в том же порядке. Но то, что заставило меня нервничать, было то, что он использует для каждого цикла в своей реализации и сохраняет сущности один за другим:

@Transactional
    public <S extends T> List<S> save(Iterable<S> entities) {
        List<S> result = new ArrayList();
        if (entities == null) {
            return result;
        } else {
            Iterator var3 = entities.iterator();

            while(var3.hasNext()) {
                S entity = var3.next();
                result.add(this.save(entity));
            }

            return result;
        }
    }

Из-за особенностей моей задачи мне абсолютно НЕОБХОДИМО, чтобы результаты были одинаковымипорядок, Моей реальной задачей является оптимизация запросов к БД, и я всегда предполагал, что когда я передаю коллекцию методу сохранения, он использует пакетные операции с гибернацией, но теперь мне интересно, действительно ли это так.

В случаеэто не так, возможно ли вообще выполнить операцию вставки / обновления BATCH с данными пружины и получить объекты результатов в том же порядке, в котором я их передал, или я просто представляю себе что-то?

1 Ответ

1 голос
/ 12 ноября 2019

Как видно из кода, порядок элементов фактически сохраняется. Хотя это не является строго гарантированным для реализаций CrudRepository.saveAll методов, вряд ли это изменится, но у AFAIK нет причин для его изменения.

Как указывал M.Deinum, пакетирование в Hibernate совершенно не связано с порядкомопераций сохранения и зависит от вашей конфигурации Hibernate.

Так что да: пакетирование возможно с Spring Data JPA.

...