ID-genereringsstrategin är avgörande för batchinfogning i Hibernate. I synnerhet kommer IDENTITY-generering vanligtvis inte fungerar (observera att AUTO vanligtvis mappar till IDENTITY också). Detta beror på att Hibernate under batchinsättning har en flagga som heter "requiresImmediateIdAccess" som säger om genererade ID:n krävs omedelbart eller inte; i så fall är batchbearbetning inaktiverad.
Du kan enkelt upptäcka detta i loggarna på DEBUG-nivå när det står "kör identitetsinfogning omedelbart" - detta betyder att den har hoppat över batchbearbetning eftersom det fick veta att genererade ID:n krävs direkt efter infogning.
Generationsstrategier som vanligtvis gör arbete är TABLE och SEQUENCE, eftersom Hibernate kan förgenerera ID:n och därigenom möjliggöra batchinsättning.
Ett snabbt sätt att upptäcka om din satsinsättning fungerar är att aktivera loggar på DEBUG-nivå eftersom BatchingBatcher uttryckligen kommer att tala om för dig batchstorleken som den kör ("Executing batch size:" + batchSize ).
Dessutom är följande egenskaper viktiga för att uppnå batchinsättning. Jag vågar inte säga att de krävs eftersom jag inte är tillräckligt med en Hibernate-expert för att göra det - det kanske bara är min speciella konfiguration - men enligt min erfarenhet behövdes de ändå:
hibernate.order_inserts = true
hibernate.order_updates = true
Dessa egenskaper är ganska dåligt dokumenterade, men jag tror att de gjorde det möjligt för SQL INSERT- och UPDATE-satserna att grupperas korrekt för batchkörning; Jag tror att det här kan vara de flerradiga skären du är ute efter. Skjut mig inte om jag har fel i detta, minns jag från minnet.
Jag ska också gå vidare och anta att du anger följande egenskap; om inte, bör detta fungera som en påminnelse:
hibernate.jdbc.batch_size = xx
Där xx är din önskade batchstorlek, naturligtvis.