O co właściwie chodzi z twoim pytaniem? Użycie @Repositoryadnotacji lub @Transactional.
@Repositorynie 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 FlushModeaby MANUALpozwolić 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 @Transactionaldo metod manipulacyjnych, które mogłeś zadeklarować lub ponownie ozdobić w tym interfejsie.