Ho un set di bean @Service
che ereditano funzionalità di base da una classe astratta. Ho contrassegnato ciascuno dei servizi di sottoclasse concreti con @Service
e @Transactional
. La super classe astratta contiene il metodo del punto di ingresso pubblico per ciascuno di questi servizi. In altre parole, ho qualcosa simile al seguente:Spring @Transferimenti ereditarietà
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
}
}
Il codice specifica in ogni servizio sottoclasse concreta rende più chiamate allo strato DAO di apportare modifiche al database, che hanno REQUIRED
come la propagazione transazionale genere.
Ora con i servizi definiti come sopra, ho scoperto che non c'era nessuna transazione corrente all'interno di alcun codice di questi servizi di sottoclasse concreti, e ogni chiamata al livello DAO stava creando una nuova transazione, facendo le modifiche, commettendo la transazione e tornando.
Tuttavia, se annotare l'astratto super-classe con @Transactional
, poi una transazione è creato correttamente, e le sub-chiamate verso lo strato DAO tutti partecipano alla transazione corrente.
Quindi la mia domanda è: quali sono le regole per ereditare il comportamento di @Transactional
? Perché Spring non usa lo @Transactional
sui servizi di sottoclasse concreti che sta effettivamente creando? Il @Transactional
deve essere sulla super-classe in questo caso, perché è qui che si trova il metodo del punto di accesso pubblico?
A proposito, ho dato un'occhiata alla [documentazione SpringSource pertinente] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework -reference.html # transaction-declarative-annotations), ma questo non sembra coprire questo. – DuncanKinnear