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
:
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?
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:
Und nun würde die ausdehnende Klasse so aussehen:
%Vor% Auf diese Weise musst du diese super
-Wrapping-Sache nur einmal machen.
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.
Anstatt @Transactional
Annotation überall hinzuzufügen, sollten Sie AOP-basiertes Transaktionsmanagement
Es empfiehlt sich, die Transaktion auf der Serviceebene zu verwenden.
Tags und Links java spring transactions spring-transactions transactional