Стратегия генерации идентификатора имеет решающее значение для пакетной вставки в Hibernate. В частности, генерация IDENTITY обычно не работает (обратите внимание, что AUTO обычно также сопоставляется с IDENTITY). Это связано с тем, что во время пакетной вставки Hibernate имеет флаг под названием «requireImmediateIdAccess», который указывает, нужны ли сгенерированные идентификаторы немедленно или нет; если это так, пакетная обработка отключена.
Вы можете легко заметить это в журналах уровня DEBUG, когда в нем говорится «немедленно выполнить вставку идентификатора» - это означает, что он пропустил пакетную обработку, поскольку ему было сказано, что сгенерированные идентификаторы необходимы сразу после вставки.
Стратегии генерации, которые обычно делают работают, ТАБЛИЦА И ПОСЛЕДОВАТЕЛЬНОСТЬ, потому что Hibernate может предварительно генерировать идентификаторы, тем самым обеспечивая возможность пакетной вставки.
Быстрый способ определить, работает ли ваша пакетная вставка, - это активировать журналы уровня DEBUG, поскольку BatchingBatcher явно сообщит вам размер пакета, который он выполняет («Выполнение размера пакета:» + batchSize).
Кроме того, следующие свойства важны для достижения пакетной вставки. Я не осмеливаюсь говорить, что они требуются, поскольку мне не хватает специалиста по Hibernate, чтобы сделать это - возможно, это просто моя конкретная конфигурация - но, по моему опыту, они были необходимы, тем не менее:
hibernate.order_inserts = true
hibernate.order_updates = true
Эти свойства довольно плохо документированы, но я считаю, что они позволили правильно сгруппировать операторы SQL INSERT и UPDATE для пакетного выполнения; Я думаю, что это могут быть многорядные вставки, которые вы ищете. Не стреляйте в меня, если я ошибаюсь, я вспоминаю по памяти.
Я также продолжу и предположу, что вы установили следующее свойство; если нет, то это должно служить напоминанием:
hibernate.jdbc.batch_size = xx
Где хх - желаемый размер партии, естественно.