O co właściwie chodzi z twoim pytaniem? Użycie @Repository
adnotacji lub @Transactional
.
@Repository
nie jest w ogóle potrzebny, ponieważ deklarowany interfejs będzie obsługiwany przez proxy, które infrastruktura Spring Data tworzy i aktywuje tłumaczenie wyjątków. Zatem użycie tej adnotacji w interfejsie repozytorium Spring Data nie ma żadnego efektu.
@Transactional
- dla modułu JPA mamy tę adnotację o klasie implementacji wspierającej proxy ( SimpleJpaRepository
). Dzieje się tak z dwóch powodów: po pierwsze, utrwalanie i usuwanie obiektów wymaga transakcji w JPA. Dlatego musimy upewnić się, że transakcja jest uruchomiona, co robimy, mając przypisaną metodę@Transactional
.
Czytanie metod jak findAll()
i findOne(…)
używania @Transactional(readOnly = true)
, które nie jest to bezwzględnie konieczne, ale wyzwala kilka optymalizacji w infrastrukturze transakcyjnej (ustawienie FlushMode
aby MANUAL
pozwolić utrzymywanie dostawcy potencjalnie pominąć brudne kontrole podczas zamykania EntityManager
). Poza tym flaga jest ustawiana również w połączeniu JDBC, co powoduje dalsze optymalizacje na tym poziomie.
W zależności od używanej bazy danych może pomijać blokady tabel lub nawet odrzucać operacje zapisu, które mogą zostać przypadkowo uruchomione. Dlatego zalecamy używanie również @Transactional(readOnly = true)
dla metod zapytań, które można łatwo osiągnąć, dodając tę adnotację do interfejsu repozytorium. Upewnij się, że dodałeś zwykły @Transactional
do metod manipulacyjnych, które mogłeś zadeklarować lub ponownie ozdobić w tym interfejsie.
@Transactional(readOnly = true)
w interfejsie (ponieważ zwykle zawiera on głównie metody wyszukiwania) i zastąpienie tego ustawienia dla każdej modyfikującej metody zapytania zwykłym@Transactional
. Właściwie tak to się robiSimpleJpaRepositoy
.Myślę, że pytanie jest nieco szersze i nie można go zredukować w adnotacjach w warstwie dostępu do danych. Musimy wziąć pod uwagę cały stos aplikacji, strategie transakcyjne, które chcemy zastosować i tak dalej. W serwisie IBM Developerworks znajduje się bardzo obszerny zbiór artykułów na ten temat autorstwa Marka Richardsa. Pierwszą znajdziesz tutaj: https://developer.ibm.com/articles/j-ts1/
Z poważaniem
źródło
Powinieneś użyć
@Repository
adnotacjiDzieje się tak, ponieważ
@Repository
służy do tłumaczenia Twojego niezaznaczonego wyjątku SQL na Spring Excpetion, a jedynym wyjątkiem, który powinieneś sobie poradzić, jestDataAccessException
źródło
Używamy również adnotacji @Transactional, aby zablokować rekord, aby inny wątek / żądanie nie zmieniły odczytu.
źródło