Spring @Transactional und Vererbung

8

Ich habe eine generikebasierte DAO-Klasse, die für alle anderen DAO-Klassen in meinem Projekt eine Basis bildet und allgemeine Funktionen enthält:

%Vor%

In meinem Projekt verwende ich mehrere Datenquellen, die auf verschiedene Datenbanken verweisen, daher habe ich mehrere Sitzungs- und Transaktionsmanager:

%Vor%

Nun möchte ich ein paar DAOs erstellen, die auf verschiedenen Datenbanken arbeiten:

%Vor%

Das Problem ist jedoch, dass alle öffentlichen Methoden von Dao nicht von @Transactional von untergeordneten Klassen abgedeckt werden, sodass keine Transaktionsverwaltung stattfindet. Die einzige Option, die ich mir vorstellen kann, ist das Überschreiben der übergeordneten Klassenmethoden, so dass sie in vererbten Klassen definiert sind und daher von @Transactional :

beachtet werden %Vor%

Aber dann müsste ich das in jeder DAO-Klasse tun, und der Code wäre überall derselbe ...

Gibt es einen besseren Weg, gemeinsame Funktionen über alle Klassen hinweg zu teilen und dennoch alle Vorteile der deklarativen Transaktionsverwaltung zu nutzen?

    
Laimoncijus 04.01.2013, 07:42
quelle

3 Antworten

1

Falls es Ihnen nichts ausmacht, dass die Klasse super auch @Transactional wäre, sollten Sie die Anmerkung auf das super DAO setzen. Falls es Ihnen etwas ausmacht, schlage ich vor, eine Erweiterungsklasse TransactionalDao zu erstellen, die das Haupt-DAO erweitert und @Transactional ist und alle DAOs, die @Transactional sein sollten, ebenfalls erweitern:

%Vor%

Und nun würde die ausdehnende Klasse so aussehen:

%Vor%

Auf diese Weise musst du diese super -Wrapping-Sache nur einmal machen.

    
Avi 12.02.2014 22:33
quelle
0

Haben Sie versucht, @Transaction auf die Methoden der übergeordneten DAO-Klasse zu setzen?

%Vor%

Auf diese Weise wird beim Aufruf von save on DAO1 die Klasse @Transaction von der Unterklasse (die angibt, welcher TX-Manager verwendet werden soll) aufgerufen und dann die Methode @Transactional von der Speichermethode der übergeordneten Methode abgerufen.

    
SergeyB 12.02.2014 22:25
quelle
-2

Anstatt @Transactional Annotation überall hinzuzufügen, sollten Sie AOP-basiertes Transaktionsmanagement wie -

%Vor%

Es empfiehlt sich, die Transaktion auf der Serviceebene zu verwenden.

    
Avinash T. 04.01.2013 07:52
quelle