¡Después de probar todas las soluciones posibles, finalmente encontré una solución para insertar 100,000 filas en 5 segundos!
Cosas que probé:
1) Se reemplazaron las identificaciones AUTOINCREMENT/GENERATED de hibernate/base de datos por identificaciones autogeneradas usando AtomicInteger
2) Habilitar lote_insertos con lote_tamaño=50
3) Vaciar el caché después de cada número de 'batch_size' de llamadas a persist()
4) subprocesamiento múltiple (no probé este)
Finalmente, lo que funcionó fue usar una consulta de inserción múltiple nativa e insertando 1000 filas en una consulta de inserción de sql en lugar de usar persist() sobre cada entidad. Para insertar 100.000 entidades, creo una consulta nativa como esta "INSERT into MyTable VALUES (x,x,x),(x,x,x).......(x,x,x)"
[1000 inserciones de fila en una consulta de inserción sql]
¡Ahora toma alrededor de 3 segundos insertar 100,000 registros! ¡Así que el cuello de botella era el propio orm! Para las inserciones masivas, lo único que parece funcionar son las consultas de inserción nativas.