Ich habe eine Reihe von @Service
Beans, die Kernfunktionalität von einer abstrakten Klasse erben. Ich habe jeden der konkreten Sub-Class-Dienste mit @Service
und @Transactional
markiert. Die abstrakte Superklasse enthält die Methode des öffentlichen Einstiegspunkts für jeden dieser Dienste. Mit anderen Worten, ich habe etwas Ähnliches wie die folgenden:Spring @Transactional Vererbungsregeln
abstract class AbstractService {
public void process() {
// Do common initialisation code here
processSpecific();
// Do common completion code here
}
abstract protected void processSpecific();
}
@Service @Transactional
public class FirstSpecificService extends AbstractService {
protected void processSpecific() {
// Do specific processing code here
}
}
@Service @Transactional
public class SecondSpecificService extends AbstractService {
protected void processSpecific() {
// Do different specific processing code here
}
}
Der spezifische Code in jedem konkreten Unterklasse-Service macht mehrere Anrufe auf die DAO-Schicht, um Änderungen an der Datenbank vornehmen, die REQUIRED
als Transaktions Ausbreitung haben Art.
Jetzt mit den oben definierten Diensten, entdeckte ich, dass es keine aktuelle Transaktion in einem der Code dieser konkreten Unterklasse-Dienste gab, und jeder Aufruf der DAO-Ebene erstellte eine neue Transaktion, die Änderungen vorgenommen, die Transaktion begehen und zurückgeben.
Allerdings, wenn ich die abstrakte Superklasse mit @Transactional
mit Anmerkungen versehen, dann eine Transaktion ist ordnungsgemäß erstellt, und die Unter Anrufe an die DAO-Schicht alle beteiligen sich an der aktuellen Transaktion.
Also meine Frage ist, was sind die Regeln für die Übernahme der @Transactional
Verhalten? Warum verwendet Spring nicht die @Transactional
für die konkreten Sub-Class-Dienste, die es tatsächlich instanziiert? Muss die @Transactional
in diesem Fall auf der Super-Klasse sein, weil das die öffentliche Einstiegspunkt-Methode ist?
Übrigens, ich habe mir die [relevante SpringSource-Dokumentation] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework) angesehen -reference.html # transaction-declarative-annotations), aber das scheint dies nicht zu erfassen. – DuncanKinnear