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.