Det er sandsynligt, at dine forespørgsler bliver omskrevet, men du ville ikke vide det ved at se på Hibernate SQL-logfilerne. Hibernate omskriver ikke insert-sætningerne - MySQL-driveren omskriver dem. Med andre ord vil Hibernate sende flere indsætningsudsagn til chaufføren, og derefter vil chaufføren omskrive dem. Så Hibernate-logfilerne viser dig kun, hvad SQL Hibernate sendte til driveren, ikke hvilken SQL driveren sendte til databasen.
Du kan bekræfte dette ved at aktivere MySQL's profileSQL-parameter i forbindelses-url:
<b:property name="jdbcUrl" value="jdbc:mysql://server:3306/db?autoReconnect=true&rewriteBatchedStatements=true&profileSQL=true" />
Ved at bruge et eksempel, der ligner dit, ser mit output sådan ud:
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)
De første 10 linjer bliver logget af Hibernate, men det er ikke det, der rent faktisk sendes til MySQL-databasen. Den sidste linje kommer fra MySQL-driveren, og den viser tydeligt en enkelt batch-indsættelse med flere værdier, og det er det, der rent faktisk sendes til MySQL-databasen.