Après avoir essayé toutes les solutions possibles j'ai enfin trouvé une solution pour insérer 100 000 lignes en moins de 5 secondes !
Choses que j'ai essayé :
1) Remplacement des identifiants AUTOINCREMENT/GENERATED d'hibernate/database par des identifiants auto-générés à l'aide d'AtomicInteger
2) Activer batch_inserts avec batch_size=50
3) Vider le cache après chaque nombre "batch_size" d'appels persist()
4) multithreading (n'a pas essayé celui-ci)
Enfin, ce qui a fonctionné, c'est d'utiliser une requête multi-insertion native et insérer 1000 lignes dans une requête d'insertion sql au lieu d'utiliser persist() sur chaque entité. Pour insérer 100 000 entités, je crée une requête native comme celle-ci "INSERT into MyTable VALUES (x,x,x),(x,x,x).......(x,x,x)"
[1000 insertions de ligne dans une requête d'insertion sql]
Maintenant, il faut environ 3 secondes pour insérer 100 000 enregistrements ! Le goulot d'étranglement était donc l'orm lui-même ! Pour les insertions en bloc, la seule chose qui semble fonctionner, ce sont les requêtes d'insertion natives !