Spring CrudRepository

0

Witam,
mam pytanie odnosnie springowego CrudRepository. Chodzi oczywiscie o JPA. Znalazlem na internecie kilka przykladow zastosowania tego interfejsu, ale nigdzie w przykladach nie widze implementacji i zastanawiam sie jak to dziala :)?

Czy to sa nie kompletne przykłady czy może implementacja jest jakos zaszyta rowniez w springu chociaz nie wiem jakby to mialo dzialac.

0
hcubyc napisał(a):

http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html
może chodzi o to?
do tego może drugi link z googla: http://stackoverflow.com/questions/14014086/what-is-difference-between-crudrepository-and-jparepository-interfaces-in-spring

No tak, o to mi chodzi, ale to są same interfejsy, a chciałem zobaczyć poszczególne implementacje tych metod zdefiniowanych w interfejsie.

0

Spring Data generuje implementacje w locie na bazie interfejsu.

1

Ta są kompletne przykłady.

Krótki wyciąg z http://projects.spring.io/spring-data/:

Launch your app and Spring Data (having been autoconfigured by Boot, SQL or NoSQL) will automatically craft a concrete set of operations:

save(Employee)
delete(Employee)
find(Employee)
find(Long)
findAll()
1

Nie musisz tworzyc implementacji aby miec mozliwosc korzystania z repozytorium Springa. Zrob sobie wlasny interfejs repozytorium, ktore dziedziczy z tego interfejsu CrudRepository a reszte zrobi Spring.

Jak bedzie Ci potrzebna nowa metoda w repozytorium to ja po prostu dopisz do interfejsu. Jezeli nazwa metody bedzie odpowiednio skonstruowana to Spring sie domysli co chcesz zrobic z baza danych. Dla przykladu, jezeli masz encje UserEntity ktora zawiera id (klucz podstawowy, zalozmy ze typu Long) to mozesz w repozytorium uzytkownikow sobie napisac metode

UserEntity findOneById(Long id);

Spring na podstawie nazwy metody domysli sie, ze chcesz pobrac uzytkownika o danym identyfikatorze. Zobacz sobie rozdzial 3.3.2 dokumentacji: http://docs.spring.io/spring-data/jpa/docs/1.7.1.RELEASE/reference/html/#jpa.query-methods.query-creation

Jezeli chcesz wyciagnac dane z bazy w troche bardziej skomplikowany sposob to zawsze mozesz sobie stworzyc zapytanie JPQL lub nawet SQL za pomoca adnotacji Query (rozdzial 3.3.4)

Natomiast jezeli juz koniecznie potrzebujesz funkcjonalnosci, ktore wymagaja implementacji to zerknij na rozdzial 2.6.

0
tk napisał(a):

Nie musisz tworzyc implementacji aby miec mozliwosc korzystania z repozytorium Springa. Zrob sobie wlasny interfejs repozytorium, ktore dziedziczy z tego interfejsu CrudRepository a reszte zrobi Spring.

Dzięki, troche mi to rozjaśniło sprawę.

0

Jak to działa? Takie mam podejrzenie:

  • przy skanie komponentów, Spring sprawdza, czy coś jest Spring CRUD repository czy nie
  • jeśli tak, to za pomocą javassista czy czegoś do manipulowania bytecodem tworzy implementację, ergo - nie trzeba się martwić o implementację
0

W miejsce referencji do interfejsu repozytorium wstrzykiwana jest generyczna implementacja org.springframework.data.jpa.repository.support.SimpleJpaRepository.

To ci siedzi pod spodem najłatwiej obadać zatrzymując się debuggerem.

0
JavaStarter napisał(a):

Czy to sa nie kompletne przykłady czy może implementacja jest jakos zaszyta rowniez w springu chociaz nie wiem jakby to mialo dzialac.

Tu masz przykład aplikacji wykorzystującej Spring Data:
https://github.com/DanielMichalski/spring-web-rss-channels.git

0

Pytanie czy save z spring data działa jak merge? Pytam, bo nie widzę update. Zapisujemy jakiś obiekt, pobieramy z bazy, znowu używamy save i jeśli ma to samo id to się zaktuakizuje, a nie stworzy kolejny tak?

0

SpringData repositories są zajebiste.

0
Biały Lew napisał(a):

Pytanie czy save z spring data działa jak merge? Pytam, bo nie widzę update. Zapisujemy jakiś obiekt, pobieramy z bazy, znowu używamy save i jeśli ma to samo id to się zaktuakizuje, a nie stworzy kolejny tak?

Działa na oba sposoby, tzn. zapisuje nowy a aktualizuje istniejący obiekt. Poniżej implementacja save z SimpleJpaRepository:

  
  @Transactional
    public <S extends T> S save(S entity) {
        if(this.entityInformation.isNew(entity)) {
            this.em.persist(entity);
            return entity;
        } else {
            return this.em.merge(entity);
        }
    }

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