Это связано с тем, как пружина генерирует транзакционные прокси.
В случае, когда у вас есть @Transactional на уровне класса, когда вы вызываете InventoryDisclosureBO.processDisclosureData()
, вы фактически вызываете Spring proxy, который запускает транзакцию, а затем вызывает реальную реализацию.
Если у вас есть только @Transaction в persis (), весна не запускает транзакцию при вызове InventoryDisclosureBO.processDisclosureData()
, а затем не может обнаружить, что вы вызвали InventoryDisclosureBO.persist()
Итак, Spring в основном игнорирует аннотацию на persist
, поскольку она не может добавить транзакционный прокси.
Как правило, аннотация @Transactional должна быть общедоступным методом и, надеюсь, достаточно высока иерархия вызовов (в противном случае каждый упор будет создавать новую транзакцию).
Вы можете найти дополнительную информацию по этому другому вопросу SO: Метод Interceptor для частных методов (любой непубличный методы ведут себя одинаково)