Насколько я понимаю, вы хотите избежать вызова метода PreparedStatement # addBatch (sql) из Hibernate (и вместо этого использовать выделенный экземпляр оператора для каждой операции). К сожалению, нет простого способа сделать это. Но ... Я проверил исходный код Hibernate, и кажется, что Hibernate проверяет несколько условий перед запуском операции обновления / вставки. Это решает, использовать ли партию или нет. Взгляните на метод AbstractEntityPersister # update. Должна быть строка вроде этой:
final boolean useBatch = j == 0 && expectation.canBeBatched() && isBatchable(); //note: updates to joined tables can't be batched...
Одна вещь, которую вы можете сделать, это заменить метод isBatchable () вашей собственной реализацией, которая всегда будет возвращать false. По умолчанию это выглядит так:
public boolean isBatchable() {
return optimisticLockMode()==Versioning.OPTIMISTIC_LOCK_NONE ||
( !isVersioned() && optimisticLockMode()==Versioning.OPTIMISTIC_LOCK_VERSION ) ||
getFactory().getSettings().isJdbcBatchVersionedData();
}
Поэтому вы можете выбрать один из следующих подходов:
- создайте свою собственную реализацию EntityPersister
- заменить исходный код Hibernate
- настроить конфигурацию, установив свойство hibernate.jdbc.batch_versioned_data = false и установив режим блокировки для каждой сущности, для которой требуется OPTIMISTIC_LOCK_ALL.
Как я уже говорил, не просто, но возможно.