2016-04-20 5 views
5

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.

+0

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

+0

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). –

+0

Danke für deine Antworten. Ich muss von session.update (item) zu diesem Ansatz wechseln, und es gibt eine Abnahme der Leistung. – Lasti

Antwort

2

Sie verwenden eine Datenbanktransaktion, um alle Ihre Aussagen zu registrieren, aber ich denke, dass Sie batch updates verwenden möchten.

Fügen Sie einfach die folgende Konfiguration Eigenschaft:

<property name="hibernate.jdbc.batch_size" value="10"/> 

Trotzdem, ich glaube, Sie Hibernate verwenden sollten, die insert/update/delete-Anweisungen zu verwalten, da Sie nur auf entity state transitions konzentrieren sollte. Der dirty checking mechanism kann automatisch Entitäten erkennen, die geändert wurden, und Hibernate kann die update-Anweisung für Sie generieren, was viel bequemer ist.