No podemos tener en la sesión de hibernate demasiados objetos porque nos quedaríamos sin memoria. en su lugar haremos un procesamiento por lotes, procesando los registros de 20 en 20 y liberando la sesión
hibernate.cfg.xml
<property name="hibernate.jdbc.batch_size">20</property>
<property name="hibernate.cache.use_second_level_cache">false</property>
Main.java
public class Main {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
for (int i = 0; i < 100000; i++) {
Libro l = new Libro();
l.setTitulo("El Quijote " + i);
session.save(l);
if (i % 20 == 0) { // 20, same as the JDBC batch size
// flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();
}
}
Documentación oficial:
https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/batch/Batching.html