Este es un ejemplo simple que he creado después de leer varios temas sobre las inserciones a granel de jpa, tengo 2 objetos persistentes Usuario y Sitio. Un usuario podría tener muchos sitios, por lo que tenemos una relación entre muchos aquí. Supongamos que quiero crear un usuario y crear/vincular varios sitios a la cuenta de usuario. Así es como se ve el código, considerando que estoy dispuesto a usar la inserción masiva para los objetos del Sitio.Inserción masiva de JPA/Hibernate (lote)
User user = new User("John Doe");
user.getSites().add(new Site("google.com", user));
user.getSites().add(new Site("yahoo.com", user));
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(user);
tx.commit();
Pero cuando corro el código (estoy usando Hibernate como proveedor de la implementación JPA) Veo siguiente salida sql:
Hibernate: insert into User (id, name) values (null, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
Por lo tanto, significa "real" mayor inserción no funciona o me ¿estoy confundido?
Aquí está source code para este proyecto de ejemplo, este es el proyecto de maven así que solo tiene que descargar y ejecutar mvn install para verificar la salida.
Actualizado:
Después de Ken Liu aconseje amablemente, He desactivado objeto de sitio generación de auto ID:
User user = new User("John Doe");
user.getSites().add(new Site(1, "google.com", user));
user.getSites().add(new Site(2, "yahoo.com", user));
entityManager.setFlushMode(FlushModeType.COMMIT);
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(user);
tx.commit();
Ahora tienen siguiente línea en la salida de depuración:
DEBUG: org. hibernate.jdbc.AbstractBatcher - Ejecutando tamaño de lote: 2
¡Funciona!
¡Oh, esto tiene sentido! Gracias – abovesun
He actualizado la pregunta, ¿podría echarle un vistazo, gracias – abovesun
cómo está generando sus claves ahora? Deberá asegurarse de que sus claves sean únicas. –