@Transactional JpaRepository

0

Witam. W projekcie spring używam JpaRepository.

Mam metodę

@Transactional 
 public void updateUser(String username)
 {
    User user = userRepository.findByUsername(username);
    if (user == null)
    {
          //zwracan blad 
          return
     }
    user.setActual(true);
    userRepository.save(user);
 }

Z tego co wyczytałem w interface JpaRepository wszystko jest @Transactional. W mojej metodzie jeżeli findByUsername nie znajdzie usera to i tak nie zmieni 'Actual'.

  1. Czy **musi **być ona @Transactional ?
  2. Czy **powinna **być ona @Transactional ?
  3. Czy to nie działa w ten sposób, że przy każdym @Transactional otwierane jest połączenie z bazą i w przypadku jak nie dam adnotacji @Transactional w tej metodzie to będzie to wyglądało w ten sposób? :
    Otwiera połączenie z bazą -> findByUsername -> zwraca wynik -> zamyka -> otwiera połączenie z bazą -> save -> zamyka.
    A dzięki @Transactional będzie: Otwiera połączenie z bazą -> findByUsername -> zwraca wynik -> save -> zamyka ?
0

Ja nie pisałem nigdy @Transactional nad warstwą DAO/Repository. @Transactional piszę tylko nad serwisami bo to na nich mam transakcje

0

No chyba ze uderzasz do repo z kontrolera po dane

0

No chyba ze uderzasz do repo z kontrolera po dane

Jak uderzasz po same dane to raczej nie potrzebujesz bo domyślna implementacja SimpleJpaRepository ma @Transactional(readOnly = true) nad całą klasą.

1

Musi byc transactional bo robisz odczyt i zapis. Takie 2 operacje muszą być w jednej transakcji, najczęściej z lockiem. Przeczytaj rozdziały 5.7, 5.8 z manuala spring-jpa. A o transakcjach to tak ogólnie musisz sobie poczytać. Bo jak piszesz, że że przy każdym @Transactional otwierane jest połączenie z bazą, to tak trochę nie bardzo. Połączenie to jedna rzecz, a transakcja inna.

A na read-only trzeba uważać, bo jest tylko hintem, provider może dać pełną transakcję. Przykładowo Spring + Glassfish + EclipseLink + Apache Derby pozwala robić update'y w transakcji read-only. A który komponent to powoduje, to już nie sprawdzałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1