2013-12-20 3 views
1

У меня есть метод M с @Transactional в услуге А.Override транзакционного метод

У меня есть service B extends A с перекрытым методом М.

Будет перекрытый метод M все еще транзакционным? Или я должен добавить туда @Transactional?

ответ

4

Что вы на самом деле спрашиваете: это аннотация @Transactional на унаследованном методе.

Короткий ответ: нет. Аннотации о методах никогда не унаследованы.

Длинный ответ: см. this post.

2

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

искривлений упорствовать предоставляет объект, на котором вы можете переопределить транзакционное поведение класса, с определенным @Transactional на конкретный метод, при желании:

@Transactional 
public class MyRepository { 
public void save(Thing t) { .. } 

@Transactional(rollbackOn = NoSuchEntityException.class) //optional 
public void remove(Thing t) { .. } 

public Thing fetch(Long id) { .. } 
} 

В примере выше, сохранить() и выборки() есть стандартное транзакционное поведение, как указано на уровне класса. Но remove() имеет конкретное предложение rollbackOn, которое используется вместо этого.

Помните, что частные методы не могут быть перехвачены для транзакционной упаковки. Это связано с тем, что вы не можете переопределять частные методы в подклассах. Если такие методы встречаются, они будут игнорироваться.

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