Comprensión de operaciones por lotes JDBC

Uso Hibernate ORM y PostgreSQL en mi aplicación, y a veces uso operaciones por lotes. Y al principio no entendía por qué en los registros con un tamaño del lote = 25, se generan 25 consultas, y al principio pensé que no funcionaba correctamente. Pero después de eso, miré el código fuente del controlador pg y encontré las siguientes líneas en la clase PgStatement:

 public int[] executeBatch() throws SQLException {
        this.checkClosed();
        this.closeForNextExecution();
        if (this.batchStatements != null && !this.batchStatements.isEmpty()) {
            this.transformQueriesAndParameters();
//confuses next line, because we have array of identical queries
            Query[] queries = (Query[])this.batchStatements.toArray(new Query[0]);
            ParameterList[] parameterLists = 
(ParameterList[])this.batchParameters.toArray(new ParameterList[0]); 
            this.batchStatements.clear();
            this.batchParameters.clear();

y en la clase PgPreparedStatement

    public void addBatch() throws SQLException {
        checkClosed();
        if (batchStatements == null) {
          batchStatements = new ArrayList<Query>();
          batchParameters = new ArrayList<ParameterList>();
        }

        batchParameters.add(preparedParameters.copy());
        Query query = preparedQuery.query;
    //confuses next line
        if (!(query instanceof BatchedQuery) || batchStatements.isEmpty()) {
          batchStatements.add(query);
        }
      }

Noté que resulta que si el tamaño del lote es de 25, se envían 25 consultas con los parámetros adjuntos.

Los registros de la base de datos confirman esto, por ejemplo:

2017-12-06 01:22:08.023 MSK [18402] postgres@buzzfactory СООБЩЕНИЕ:  выполнение S_3: BEGIN
2017-12-06 01:22:08.024 MSK [18402] postgres@buzzfactory СООБЩЕНИЕ:  выполнение S_4: select nextval ('tests_id_seq')
2017-12-06 01:22:08.041 MSK [18402] postgres@buzzfactory СООБЩЕНИЕ:  выполнение S_2: insert into tests (name, id) values ($1, $2)     
2017-12-06 01:22:08.041 MSK [18402] postgres@buzzfactory ПОДРОБНОСТИ:  параметры: $1 = 'test', $2 = '1'
2017-12-06 01:22:08.041 MSK [18402] postgres@buzzfactory СООБЩЕНИЕ:  выполнение S_2: insert into tests (name, id) values ($1, $2)
2017-12-06 01:22:08.041 MSK [18402] postgres@buzzfactory ПОДРОБНОСТИ:  параметры: $1 = 'test', $2 = '2'
...
x23 queries with parameters 
...
2017-12-06 01:22:08.063 MSK [18402] postgres@buzzfactory СООБЩЕНИЕ:  выполнение S_5: COMMIT

Pero pensé que una consulta debe ejecutarse con una matriz de 25 parámetros. ¿O no entiendo cómo funcionan las inserciones por lotes con una declaración preparada? ¿Por qué duplicar una consulta n veces?

Después de todo, traté de depurar mis consultas en este lugar

if (!(query instanceof BatchedQuery) || batchStatements.isEmpty()) {

y noté que mis consultas siempre son instancias de SimpleQuery en lugar de BatchedQuery. Tal vez esta es la solución al problema? Información sobre BatchedQuery que no pude encontrar