2013-05-22 14 views
11

Wiosna mówi abuot @TransactionalWiosna @Transactional klasa vs metody zasad pierwszeństwa

Lokalizacja najbardziej pochodzić ma pierwszeństwo przy ocenie ustawień transakcyjnych dla metody.

Czy to oznacza, że ​​adnotacja od metody całkowicie zastępuje adnotację z klasy lub czy pominięte atrybuty (tak domyślne) nie są liczone?

E.g.

@Transactional(isolation=Isolation.SERIALIZABLE) 
public class MyService { 

    @Transactional(readOnly=true) 
    public void method() { 
     ... 
    } 
} 

Jakie są więc ustawienia izolacji metody? Czy to jest Isolation.DEFAULT, ponieważ jest to wartość domyślna, więc domyślnie zastępuje Isolation.SERIALIZABLE lub jest to Isolation.SERIALIZABLE, ponieważ żadna nie została wyraźnie określona w adnotacji metody?

Odpowiedz

19

Adnotacja na poziomie metody całkowicie zastępuje adnotację na poziomie typu. Jakakolwiek hierarchia nie jest tutaj możliwa. Pozwól mi wyjaśnić trochę więcej. Nie ma możliwości sprawdzenia, czy określona została wartość dla użytkownika dla określonego atrybutu, lub jeśli zwracana jest wartość default po odczytaniu atrybutów adnotacji. Tak więc, Spring lub ktokolwiek inny, nie może określić, czy określony atrybut został nadpisany lub czy używana jest wartość domyślna. Tak więc nie ma sposobu na podjęcie decyzji na podstawie obecności lub braku atrybutu. Z tego powodu za każdym razem, gdy zastępujesz jakąkolwiek adnotację (tj. Określasz ją z dokładniejszą szczegółowością), musisz podać wszystkie wymagane atrybuty. Tak więc, w twoim przypadku, Isolation.DEFAULT zostanie zastosowany jako .

Jednak, na marginesie, załóżmy, że masz własną niestandardową adnotację, która określa pusty ciąg jako wartość domyślną dla jakiegoś atrybutu. W takim przypadku, jeśli adnotacja na poziomie klasy określa niepusty łańcuch dla tego atrybutu, a adnotacja na poziomie metody nie określa żadnej wartości (a zatem używa wartości domyślnej: pustego ciągu znaków), można uzyskać należy użyć wartości atrybutu z adnotacji na poziomie klasy. To znaczy, nie zezwalając na wartość domyślną w adnotacji na poziomie metody, aby przesłonić podaną przez użytkownika wartość określoną przez użytkownika na na poziomie klasy. W każdym takim scenariuszu należy upewnić się, że wartość domyślna nie reprezentuje prawidłowej wartości atrybutu. W przypadku adnotacji @Transactional, reprezentuje poprawną wartość i może być jawnie określona przez użytkownika.

+0

Dobra odpowiedź, zwłaszcza drugi akapit dotyczący niestandardowych adnotacji i wartości domyślnych. –

Powiązane problemy