que tienen un conjunto de @Service
granos que heredan funcionalidad básica de una clase abstracta. Marqué cada uno de los servicios de subclase concretos con @Service
y @Transactional
. La superclase abstracta contiene el método de punto de entrada público para cada uno de estos servicios. En otras palabras, tengo algo similar a lo siguiente:reglas de herencia primavera @Transactional
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
}
}
El código específico en cada servicio subclase concreta hace varias llamadas a la capa DAO para realizar cambios en la base de datos, que tienen REQUIRED
como la propagación transaccional tipo.
Ahora, con los servicios definidos anteriormente, descubrí que no había ninguna transacción actual dentro del código de estos servicios concretos de subclase, y cada llamada a la capa DAO estaba creando una nueva transacción, haciendo los cambios, comprometer la transacción y regresar.
Sin embargo, si anoto la super-clase abstracta con @Transactional
, a continuación, una transacción es creado correctamente, y los sub-llamadas a la capa DAO todos participan en la transacción actual.
Así que mi pregunta es, ¿cuáles son las reglas para heredar el comportamiento @Transactional
? ¿Por qué Spring no usa el @Transactional
en los servicios de subclase concretos que en realidad está creando instancias? ¿El @Transactional
necesita estar en la superclase en este caso porque ahí es donde se encuentra el método de punto de entrada público?
Por cierto, he echado un vistazo a la [documentación relevante de SpringSource] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework -reference.html # transaction-declarative-annotations), pero eso no parece cubrir esto. – DuncanKinnear