2009-05-20 12 views
1

Ich habe diesen Code:Wie kann ich eine Transaktion im Frühling mit JPA abbrechen?

run big query: Select all unprocessed objects from table A 
for each result 
    create or update an output object in table B 
    update input object: Set it to "processed" 

Ich möchte eine Transaktion über die Schleife haben, also nach einer Reihe von Eingangs verarbeitet wird, sollten die aktualisierten Objekte begangen werden, so dass, wenn das Programm abbricht, Es wird nicht alle Zeilen erneut verarbeiten, sondern mit der fehlerhaften Zeile beginnen.

Ich verwende Spring 2.5, Hibernate 3.4 und JPA (d. H. Ich habe eine EntityManager).

Wie mache ich das? Ich habe versucht, em.getTransaction().commit() in der Schleife anzurufen, aber Frühling lässt das nicht zu.

Antwort

0

Ohne die Feder docs nachschlagen und Ihre Transaktion Setup nicht zu wissen:

Zunächst müssen Sie einen Transaktionsmanager (wahrscheinlich HibernateTransactionManager) einrichten. Dann IMHO ist es am besten, Spring's TransactionTemplate zu verwenden, um jede Iteration innerhalb einer eigenen Transaktion auszuführen. Sie müssen sicherstellen, dass entweder das TransactionTemplate tatsächlich eine neue Transaktion startet oder beim Eingeben der Methode keine Transaktion ausgeführt wird.

Ein Tipp: Verwenden Sie den Klassennamen des Transaktionsmanagers als Protokollkategorie für das Debugging des Transaktionsverhaltens.

1

Die Leseoperationen des Entitätsmanagers erfordern keine Transaktion. Also würde ich versuchen, eine interne Methode zu reaktivieren, um die Zeile zu aktualisieren und sie auf transaktional zu setzen. Beachten Sie, dass es eine öffentliche Methode sein muss, um @transactional zu verwenden.

2

Ich würde empfehlen, Blick auf Frühling TransactionTemplate. Die TransactionTemplate documentation enthält Beispiele, die genau das adressieren, was Sie erreichen möchten.

Verwandte Themen