JPA / Hibernate Bulk (Batch) Insert

Hier ist ein einfaches Beispiel, das ich erstellt habe, nachdem ich mehrere Themen über JPA-Masseneinfügungen gelesen habe. Ich habe 2 beständige Objekte Benutzer und Site. Ein Benutzer könnte viele Websites haben, daher haben wir hier eine zu viele Beziehungen. Angenommen, ich möchte einen Benutzer erstellen und mehrere Websites mit einem Benutzerkonto verknüpfen. So sieht Code aus, wenn ich bedenke, dass ich Bulk-Insert für Site-Objekte verwenden möchte.

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();

Aber wenn ich diesen Code ausführe (ich verwende Hibernate als JPA-Implementierungsanbieter), wird folgende SQL-Ausgabe angezeigt:

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()

Also, ich meine "echte" Masseneinfügung funktioniert nicht oder ich bin verwirrt?

Hier istQuellcod Für dieses Beispielprojekt ist dies ein Maven-Projekt. Sie müssen also nur mvn install herunterladen und ausführen, um die Ausgabe zu überprüfen.

AKTUALISIERT

Nach dem Hinweis von Ken Liu habe ich die automatische Generierung der Site-Objekt-ID deaktiviert:

    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();

Jetzt habe ich folgende Zeile in der Debug-Ausgabe:

DEBUG: org.hibernate.jdbc.AbstractBatcher - Batchgröße wird ausgeführt: 2

Es klappt

Antworten auf die Frage(6)

Ihre Antwort auf die Frage