У меня есть набор @Service
bean-компонентов, которые наследуют основные функции от абстрактного класса. Я пометил каждую из конкретных услуг подкласса @Service
и @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
}
}
Конкретный код в каждой конкретной службе подкласса выполняет несколько вызовов на уровне DAO для внесения изменений в базу данных, в которой REQUIRED
имеет тип распространения транзакции.
Теперь со службами, определенными выше, я обнаружил, что в каком-либо коде этих конкретных служб подклассов не было текущей транзакции, и каждый вызов уровня DAO создавал новую транзакцию, делал изменения, фиксировал транзакция и возврат.
Однако, если я аннотирую абстрактный суперкласс с @Transactional
, тогда транзакция будет создана правильно, и все вспомогательные вызовы уровня DAO участвуют в текущей транзакции.
Итак, мой вопрос: каковы правила наследования поведения @Transactional
? Почему Spring не использует @Transactional
на конкретных службах подкласса, которые он фактически создает? Нужно ли @Transactional
быть в суперклассе в этом случае, потому что именно в этом случае используется публичный метод точки входа?