2015-01-27 2 views
1

У меня есть класс с несколькими методами. Некоторые из них являются публичными, а другие - нет. См. Пример ниже.Весенний @Transactional на уровне класса применяется к каким методам?

Какие методы будут выполняться в контексте транзакции? Только публичные?

Не удалось найти ответ в documentation.

@Transactionl 
public class A { 
    public void pub() {...} 
    void pack() {...} 
    protected void prot() {...} 
    private void pri() {...} 
} 
+0

Обычно у вас есть служебный интерфейс и функция транзакции реализована через прокси JDK. В этом случае проксируются (и, следовательно, транзакционные) только методы из интерфейса службы. Без сервисного интерфейса - ваш случай, я полагаю, класс A не имеет никаких инструментов - вам нужно перейти с параметром proxy-target-class в true, и я ожидаю, что каждый метод, который вам удастся вызвать из-за пределов транзакции, public, protected и package default. – Michal

+0

[Это в документации] (http://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/htmlsingle/#aop-understanding-aop-proxies), просто не в разделе о '@ Transactional'. Как отметил Михал, '@ Transactional' работает, создавая прокси. Таким образом, только вызовы, проходящие через прокси, вызывают логику '@ Transactional'. Есть исключения из этого. Вы можете использовать время компиляции вместо прокси-серверов времени выполнения, чтобы получить '@ Transactional' по частным/защищенным методам. –

+0

Ну, я ошибся с моим ожиданием. Фактически документы говорят об этом с формулировкой, довольно близкой к ответу Паулиуса Матулиониса. Поиск в документах для «Если вы делаете аннотацию защищенного, частного или« находит его в документах ». Я думаю, что это правильный ответ. – Michal

ответ

0

Да, только общественные методы будут демонстрировать транзакционные настройки. Если вы добавили аннотацию @Transactional к частным, защищенным или видимым пакетам методам или к классу, который имеет такие методы, не будет возникать ошибка, это просто, что ваши транзакционные параметры не будут выполняться для этих методов.

Так что в вашем случае сделка будет открыта только по этому методу:

public void pub() {...} 

документация может быть найдена here.

+0

Спасибо. Как вы это поняли? Можете ли вы указать на исходный код или документацию? –

+0

Я добавил ссылку на документы. Пожалуйста, смотрите. –

+0

Извините. Не упоминается, что только публичные методы являются транзакционными, когда аннотация находится на уровне класса. Что говорят документы, так это то, что аннотация @Transactional не может быть помещена в ** непубличные методы **. –

Смежные вопросы