Ich verwende Hibernate für meine ORM-Ebene. Ich versuche, Stapel von HQL-Abfragen in einer Transaktion auszuführen (ich kann session.update nicht verwenden). Das Problem ist, dass selbst die transaction.commit() am Ende der Schleife ist, die Update-Abfragen nacheinander ausgeführt werden. Gibt es eine Möglichkeit, mehrere HQL-Abfragen in einer Transaktion auszuführen?Hibernate Batch-Update mit HQL-Abfrage
public void updateItems() {
t = session.beginTransaction();
for (int i = 0; i < itemList.size(); i++) {
Query q = createUpdateQuery(session, itemList.get(i));
q.executeUpdate(); //updating one by one, and not waiting for transaction commit
}
t.commit();
}
Query createUpdateQuery(Session session, Item item) {
Query q = session.createQuery(
"Update Item i set i.notes=:notes, i.time=:time, i.counter=:counter, i.status=:status Where i.id=:id and i.time=:time");
q.setParameter("time", item.getTime());
q.setParameter("status", item.getStatus());
q.setParameter("notes", item.getNotes());
q.setParameter("id", item.getId());
return q;
}
Schätzen Sie jede Hilfe.
Ich sehe nichts offensichtlich falsch mit Ihrem Code. Die Aktualisierungen werden nacheinander in der Datenbank ausgeführt, aber erst nach dem Aufruf der Festschreibung ausgeführt. Sie sollten die Transaktion jederzeit zurücksetzen können, bevor Sie die Festschreibung aufrufen. Das ist ziemlich Standard. Sind Sie nur besorgt über die Anzahl der Rundreisen in die Datenbank? – markwatsonatx
Mit einer Transaktion bedeutet nicht, mehrere Updates in großen großen Stapel zu senden. Und es gibt einfach zu viele Dinge, die in Ihrer Herangehensweise nicht gut aussehen (ich wünschte, Sie würden das im Produktionscode tun). –
Danke für deine Antworten. Ich muss von session.update (item) zu diesem Ansatz wechseln, und es gibt eine Abnahme der Leistung. – Lasti