Jaka jest różnica między Hibernate a Spring Data JPA

207

Jakie są główne różnice między Hibernacją a JPA Spring Data? Kiedy nie powinniśmy używać JPA Hibernacji lub Spring Data? Ponadto, kiedy szablon Spring JDBC może działać lepiej niż JPA Hibernate / Spring Data?

twardy koder
źródło
7
@ NeilStockton pytanie o porównanie dwóch technologii nie wymaga opinii.
Philip Rego

Odpowiedzi:

262

Hibernacja to implementacja JPA, natomiast Spring Data JPA to abstrakcja dostępu do danych JPA. Spring Data JPA nie może działać bez dostawcy JPA.

Spring Data oferuje rozwiązanie dla wzoru DDDRepository lub starszych GenericDaoniestandardowych implementacji. Może również generować zapytania JPA w Twoim imieniu za pomocą konwencji nazw metod.

W Spring Data możesz używać Hibernacji, Eclipse Link lub dowolnego innego dostawcy JPA. Bardzo interesującą zaletą korzystania z Spring lub Java EE jest możliwość deklaratywnego kontrolowania granic transakcji za pomocą @Transactionaladnotacji .

Spring JDBC jest znacznie lżejszy i jest przeznaczony do natywnych zapytań, a jeśli zamierzasz korzystać tylko z JDBC samodzielnie, lepiej skorzystaj z Spring JDBC, aby poradzić sobie z gadatliwością JDBC.

Dlatego Hibernate i Spring Data uzupełniają się, a nie konkurują.

Vlad Mihalcea
źródło
52
Czy to oznacza, że ​​JPA Spring Data nie może istnieć samodzielnie? Czyli pod maską korzysta z jednego z dostawców JPA (takich jak Hibernate, Eclipselink lub jakikolwiek inny dostawca JPA)?
CuriousMind
Mam na myśli, że jeśli używam tylko hibernacji, konfiguracja poziomu hibernacji jest niewielka. Jeśli użyję danych wiosennych jpa, wygląda to znacznie łatwiej niż hibernacja. W tym sensie zadałem ci to pytanie.
Asif Mushtaq
1
Mówiąc dokładniej, do tej pory wszystko działa dobrze, wystarczy zrozumieć najwyższy poziom, tj. JPA Spring Data. Z pierwszym wyjątkiem potencjalnie musisz znać niższe poziomy, tj. Hibernacja, JDBC i Baza danych.
Marmite Bomber
138

Używamy tutaj 3 różnych rzeczy:

  1. JPA: Interfejs API trwałości Java, który zapewnia specyfikację utrwalania, odczytu, zarządzania danymi z obiektu Java do relacji w bazie danych.
  2. Hibernacja: Istnieje wiele dostawców, którzy implementują JPA. Hibernacja jest jednym z nich. Mamy więc także innego dostawcę. Ale jeśli użyjesz jpa ze wiosną, możesz w przyszłości zmienić dostawców.
  3. Dane wiosenne JPA: Jest to kolejna warstwa na JPA, która zapewnia wiosnę, aby ułatwić Ci życie.

Więc pozwala zrozumieć, jak JPA dane wiosna i wiosna + hibernacji works-


Dane wiosenne JPA:

Załóżmy, że używasz aplikacji Spring + Hibernacja. Teraz musisz mieć interfejs dao i implementację, w której będziesz pisać operację crud za pomocą SessionFactory hibernacji. Powiedzmy, że piszesz klasę dao dla klasy Employee, jutro w aplikacji może być konieczne napisanie podobnej operacji dla innych podmiotów. Jest więc dużo kodu, który możemy zobaczyć tutaj.

Teraz jpa danych Spring pozwala nam definiować interfejsy dao poprzez rozszerzenie jego repozytoriów (crudrepository, jparepository), aby zapewnić implementację dao w czasie wykonywania. Nie musisz już pisać implementacji dao. W ten sposób jpa danych wiosennych ułatwia życie.

Bhagwati Malav
źródło
3
Czym więc jest implementacja JPA Spring Data, czy to hibernacja?, ponieważ kiedy korzystam z PagingAndSortingRepository, pokazuje ona dzienniki Hibernacji w konsoli.
Vicky
2
Spring Data JPA domyślnie używa implementacji Hibernacji. Jeśli widzisz przechodnie zależności od spring-boot-starter-data-jpa, możesz zobaczyć tam hibernację-rdzeń
IamVickyAV
28

Nie zgadzam się, że SpringJPA ułatwia życie. Tak, zapewnia pewne klasy i możesz szybko zrobić prosty DAO, ale tak naprawdę to wszystko, co możesz zrobić. Jeśli chcesz zrobić coś więcej niż findById () lub zapisać, musisz przejść przez piekło:

  • brak dostępu EntityManager w klasach org.springframework.data.repository (jest to podstawowa klasa JPA!)
  • zarządzanie własnymi transakcjami (niedozwolone transakcje hibernacji)
  • ogromne problemy z więcej niż jedną konfiguracją źródeł danych
  • brak puli danych (HikariCP musi być używany jako biblioteka strony trzeciej)

Dlaczego własne zarządzanie transakcjami jest wadą? Ponieważ Java 1.8 pozwala na stosowanie domyślnych metod w interfejsach, transakcje oparte na adnotacjach Springa, proste nie działają.

Niestety, SpringJPA opiera się na odbiciach i czasami trzeba skierować nazwę metody lub pakiet encji do adnotacji (!). Dlatego wszelkie refaktoryzacje powodują duże awarie. Niestety @Transactional działa tylko dla podstawowego DS :( Więc jeśli masz więcej niż jedno źródło danych, pamiętaj - transakcje działają tylko dla podstawowego :)

Jakie są główne różnice między Hibernacją a JPA Spring Data?

Hibernacja jest kompatybilna z JPA, zgodna z SpringJPA Spring. Twój HibernateJPA DAO może być używany z JavaEE lub Hibernate Standalone, gdy SpringJPA może być używany w Spring - na przykład SpringBoot

Kiedy nie powinniśmy używać JPA Hibernacji lub Spring Data? Ponadto, kiedy szablon Spring JDBC może działać lepiej niż JPA Hibernate / Spring Data?

Używaj Spring JDBC tylko wtedy, gdy potrzebujesz dużo połączeń lub gdy potrzebujesz Springa z wieloma połączeniami źródła danych. Ogólnie rzecz biorąc, unikaj JPA dla połączeń.

Ale moja ogólna rada, użyj świeżego rozwiązania - Daobab ( http://www.daobab.io ). Daobab jest moim integratorem Java i dowolnego silnika JPA i wierzę, że to bardzo pomoże w twoich zadaniach :)

Klaudiusz Wojtkowiak
źródło
2
Daobab, naprawdę? Jeśli nie podoba ci się jpql typu bezpieczeństwo typu (ja nie), JPA ma API typu bezpieczne kryteria ... Standardowy JPA jest lepszy niż ta kiepska alternatywa.
ymajoros
8

Spring Datajest dodatkową biblioteką JPApodręczną, która abstrahuje od wielu rzeczy i zapewnia magię wiosny (podobną lub nie) do dostępu do sklepu trwałości. Służy głównie do pracy z relacyjnymi bazami danych. Krótko mówiąc, pozwala zadeklarować interfejsy, które mają takie metody, findByNameOrderByAge(String name);które zostaną przeanalizowane w czasie wykonywania i zamienione na odpowiednie JPAzapytania.

Umieszczenie go na szczycie JPAsprawia, że ​​jego użycie jest kuszące:

  1. Deweloperzy nowicjuszy, którzy go nie znają SQLlub źle znają. To jest przepis na katastrofę, ale mogą uciec, jeśli projekt jest trywialny.

  2. Doświadczeni inżynierowie, którzy wiedzą, co robią i chcą szybko wszystko rozwijać. To może być realna strategia (ale czytaj dalej).

Z mojego doświadczenia Spring Datawynika, że ​​jego magia jest zbyt duża (dotyczy to Springogólnie). Zacząłem intensywnie z niego korzystać w jednym projekcie i ostatecznie trafiłem w kilka przypadków narożnych, w których nie mogłem zejść z biblioteki, i skończyło się to brzydkimi obejściami. Później przeczytałem skargi innych użytkowników i zdałem sobie sprawę, że są to typowe problemy Spring Data. Na przykład sprawdź ten problem, który doprowadził do wielu godzin dochodzenia / przekleństw:

 public TourAccommodationRate createTourAccommodationRate(
        @RequestBody TourAccommodationRate tourAccommodationRate
    ) {
        if (tourAccommodationRate.getId() != null) {
            throw new BadRequestException("id MUST NOT be specified in a body during entry creation");
        }

        // This is an ugly hack required for the Room slim model to work. The problem stems from the fact that
        // when we send a child entity having the many-to-many (M:N) relation to the containing entity, its
        // information is not fetched. As a result, we get NPEs when trying to access all but its Id in the
        // code creating the corresponding slim model. By detaching the entity from the persistence context we
        // force the ORM to re-fetch it from the database instead of taking it from the cache

        tourAccommodationRateRepository.save(tourAccommodationRate);
        entityManager.detach(tourAccommodationRate);
        return tourAccommodationRateRepository.findOne(tourAccommodationRate.getId());
    }

W końcu zszedłem na niższy poziom i zacząłem używać JDBI- ładnej biblioteki z wystarczającą „magią”, aby ocalić cię od płyty kotłowej. Dzięki temu masz pełną kontrolę nad zapytaniami SQL i prawie nigdy nie musisz walczyć z biblioteką.

raiks
źródło
to dobra odpowiedź, ale jeśli mógłbyś wymienić listę narożnych skrzynek i szczegółowo ją szczegółowo opisać, będzie to bardzo pomocne. Stanie się świetną odpowiedzią. Dzięki
John
Cóż, niełatwo jest przywołać te, biorąc pod uwagę, że od dłuższego czasu nie pracowałem z Spring Data - będę musiał przejrzeć stary kod i dodać więcej komentarzy. Jednak jedna z irytacji prosto z mojej głowy - w JPA bardzo często obiekty muszą się nawzajem odnosić (np. W przypadku operacji kaskadowych). Powoduje to błąd przepełnienia stosu (z powodu odwołań cyklicznych), gdy Spring próbuje je serializować, zmuszając Cię do brzydkich błahostek / obejść. Ten problem jest jednak styczny do Spring Data, ponieważ jest to problem JPA. Ponieważ jednak JPA jest podstawą Spring Data, dostajesz go „za darmo”.
raiks
Edytowałem post i dodałem jeszcze jeden przykład.
raiks
1

Hibernacja to implementacja „JPA”, która jest specyfikacją obiektów Java w bazie danych.

Polecam użycie wrt JPA, ponieważ możesz przełączać się między różnymi ORMS.

Kiedy używasz JDBC, musisz używać zapytań SQL, więc jeśli jesteś biegły w SQL, wybierz JDBC.

Thoopalliamar
źródło
1

Jeśli wolisz prostotę i większą kontrolę nad zapytaniami SQL, sugeruję skorzystanie z Spring Data / Spring JDBC.

Jego duża ilość krzywej uczenia się w JPA i czasami trudne do debugowania problemów. Z drugiej strony, gdy masz pełną kontrolę nad SQL, znacznie łatwiej jest zoptymalizować zapytania i poprawić wydajność. Możesz łatwo udostępnić swój SQL DBA lub komuś, kto lepiej rozumie bazę danych.

GPopat
źródło