Nachdem ich alle möglichen Lösungen ausprobiert hatte, fand ich endlich eine Lösung, um 100.000 Zeilen in weniger als 5 Sekunden einzufügen!
Dinge, die ich versucht habe:
1) Hibernate/Datenbank-IDs AUTOINCREMENT/GENERATED durch selbst generierte IDs mit AtomicInteger ersetzt
2) Aktivierung von batch_inserts mit batch_size=50
3) Leeren des Caches nach jeder 'batch_size'-Anzahl von persist()-Aufrufen
4) Multithreading (habe es nicht versucht)
Was schließlich funktionierte, war die Verwendung einer nativen Multi-Insert-Abfrage und Einfügen von 1000 Zeilen in eine SQL-Einfügeabfrage anstelle von persist() auf jeder Entität. Zum Einfügen von 100.000 Entitäten erstelle ich eine native Abfrage wie diese "INSERT into MyTable VALUES (x,x,x),(x,x,x).......(x,x,x)"
[1000 Zeileneinfügungen in einer SQL-Einfügungsabfrage]
Jetzt dauert es etwa 3 Sekunden, um 100.000 Datensätze einzufügen! Der Engpass war also das Orm selbst! Bei Masseneinfügungen scheint das Einzige, was zu funktionieren scheint, native Einfügungsabfragen!