È probabile che le tue query vengano riscritte, ma non lo sapresti se esaminando i registri SQL di Hibernate. Hibernate non riscrive le istruzioni di inserimento:il driver MySQL le riscrive. In altre parole, Hibernate invierà più istruzioni di inserimento al driver, quindi il driver le riscriverà. Quindi i log di Hibernate mostrano solo cosa SQL Hibernate ha inviato al driver, non quale SQL il driver ha inviato al database.
Puoi verificarlo abilitando il parametro profileSQL di MySQL nell'URL di connessione:
<b:property name="jdbcUrl" value="jdbc:mysql://server:3306/db?autoReconnect=true&rewriteBatchedStatements=true&profileSQL=true" />
Utilizzando un esempio simile al tuo, ecco come appare il mio output:
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
Wed Feb 05 13:29:52 MST 2014 INFO: Profiler Event: [QUERY] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) duration: 1 ms, connection-id: 81, statement-id: 33, resultset-id: 0, message: insert into Person (firstName, lastName, id) values ('person1', 'Name', 1),('person2', 'Name', 2),('person3', 'Name', 3),('person4', 'Name', 4),('person5', 'Name', 5),('person6', 'Name', 6),('person7', 'Name', 7),('person8', 'Name', 8),('person9', 'Name', 9),('person10', 'Name', 10)
Le prime 10 righe vengono registrate da Hibernate anche se questo non è ciò che viene effettivamente inviato al database MySQL. L'ultima riga proviene dal driver MySQL e mostra chiaramente un singolo inserimento batch con più valori ed è ciò che viene effettivamente inviato al database MySQL.