wake-up-neo.com

Wie verwende ich @Transactional mit Spring Data?

Ich habe gerade angefangen an einem Spring-Data, Hibernate, MySQL, JPA Projekt zu arbeiten. Ich bin zu spring-data gewechselt, damit ich mir keine Sorgen um das manuelle Erstellen von Abfragen machen muss.

Mir ist aufgefallen, dass die Verwendung von @Transactional ist nicht erforderlich, wenn Sie Spring-Daten verwenden, da ich meine Abfragen auch ohne die Anmerkung ausprobiert habe.

Gibt es einen bestimmten Grund, warum ich das @Transactional Anmerkung?

Werke:

@Transactional
public List listStudentsBySchool(long id) {
    return repository.findByClasses_School_Id(id);
}

Funktioniert auch:

public List listStudentsBySchool(long id) {
    return repository.findByClasses_School_Id(id);
}

Danke im Voraus!

66
Byron Voorbach

Worum geht es in Ihrer Frage eigentlich? Die Verwendung der Annotation @Repository Oder @Transactional.

@Repository Wird überhaupt nicht benötigt, da die von Ihnen deklarierte Schnittstelle von einem Proxy unterstützt wird, den die Spring Data-Infrastruktur erstellt und die Ausnahmekonvertierung für sowieso aktiviert. Die Verwendung dieser Annotation in einer Spring Data-Repository-Schnittstelle hat also keinerlei Auswirkungen.

@Transactional - für das JPA-Modul haben wir diese Anmerkung zur Implementierungsklasse, die den Proxy unterstützt ( SimpleJpaRepository ). Dies hat zwei Gründe: Erstens erfordert das Beibehalten und Löschen von Objekten eine Transaktion in JPA. Daher müssen wir sicherstellen, dass eine Transaktion ausgeführt wird, indem wir die Methode mit @Transactional Kommentieren.

Lesemethoden wie findAll() und findOne(…) verwenden @Transactional(readOnly = true), was nicht unbedingt erforderlich ist, aber einige Optimierungen in der Transaktionsinfrastruktur auslöst (Setzen des FlushMode to MANUAL, damit Persistenzanbieter beim Schließen von EntityManager) möglicherweise Dirty Checks überspringen. Darüber hinaus wird das Flag auch in der JDBC-Verbindung gesetzt, was zu weiteren Optimierungen auf dieser Ebene führt.

Abhängig davon, welche Datenbank Sie verwenden, können Tabellensperren weggelassen oder sogar Schreibvorgänge zurückgewiesen werden, die Sie möglicherweise versehentlich auslösen. Daher empfehlen wir die Verwendung von @Transactional(readOnly = true) auch für Abfragemethoden, mit denen Sie diese Annotation problemlos zu Ihrer Repository-Schnittstelle hinzufügen können. Stellen Sie sicher, dass Sie den Manipulationsmethoden, die Sie in dieser Schnittstelle deklariert oder neu dekoriert haben, ein einfaches @Transactional Hinzufügen.

115
Oliver Drotbohm

Ich denke, die Frage ist etwas weiter gefasst und kann nicht auf die Anmerkungen auf der Datenzugriffsebene reduziert werden. Wir müssen den gesamten Stapel der Anwendung, die Transaktionsstrategien, die wir anwenden möchten, und so weiter berücksichtigen. Auf der IBM Developerworks-Website finden Sie eine sehr umfassende Sammlung von Artikeln zu diesem Thema von Mark Richards. Den ersten finden Sie hier: http://www.ibm.com/developerworks/Java/library/j-ts1/index.html

Freundliche Grüße

3
dgiffone

Du solltest benutzen @Repository Anmerkung

Das ist weil @Repository wird verwendet, um Ihre ungeprüfte SQL-Ausnahme in Spring Excpetion zu übersetzen. Die einzige Ausnahme, die Sie behandeln sollten, ist DataAccessException.

1
danny.lesnik