Jaka jest różnica między JPA a Hibernacją? [Zamknięte]


680

Rozumiem, że JPA 2 to specyfikacja, a Hibernacja to narzędzie do ORM. Rozumiem również, że Hibernacja ma więcej funkcji niż JPA 2. Ale z praktycznego punktu widzenia, jaka jest naprawdę różnica?

Mam doświadczenie w korzystaniu z iBatis i teraz próbuję nauczyć się Hibernacji lub JPA2. Wziąłem książkę Pro JPA2, która wciąż odnosi się do „dostawcy JPA”. Na przykład:

Jeśli uważasz, że funkcja powinna zostać znormalizowana, powinieneś zabrać głos i poprosić o nią dostawcę JPA

To mnie dezorientuje, więc mam kilka pytań:

  • Używając samego JPA2, mogę pobrać dane z DB, po prostu dodając adnotacje do moich POJO
  • Czy JPA2 powinien być używany z „dostawcą JPA”, np. TopLink lub Hibernacja? Jeśli tak, to jaka jest korzyść ze stosowania JPA2 + Hibernacja w porównaniu do samego JPA2 lub w porównaniu do samego Hibernacji?
  • Czy możesz polecić dobrą praktyczną książkę JPA2. „Pro JPA2” wydaje się bardziej biblijną i referencją na temat JPA2 (pojawia się w zapytaniach dopiero w drugiej połowie książki). Czy istnieje książka, która podchodzi do problemu JPA2?

2
Pytanie o „różnicę między JPA a Hibernacją” jest nieprawidłowe. Bitwa Hibernacja kontra JPA jest bezcelowa. Wskazane jest użycie dowolnej implementacji JPA z JPA API, aby uniknąć implementacji różnych ORM.
BERGUIGA Mohamed Amine

18
@ Berguiga.M. Amine, Jeśli już wiemy, że powyższe pytanie jest nieprawidłowe. Nie potrzebujemy już pytać. Interesuję się również tym tematem.
Do Nhu Vy

Mam zamieszanie z JpaTemplate używanym wiosną "org.springframework.orm.jpa.JpaTemplate", ma on swoje własne funkcje, takie jak persist (), find (), merge () itd. A następnie jak działa to bez hibernacji?
nitin verma,

@nitinverma: To naprawdę osobne pytanie. Jeśli nadal potrzebujesz odpowiedzi, sugeruję, aby zadać osobne pytanie osobno, aby uzyskać więcej opinii.
Wouter

Odpowiedzi:


776

Jak podajesz, JPA to tylko specyfikacja, co oznacza, że ​​nie ma implementacji. Za pomocą adnotacji JPA możesz adnotować swoje zajęcia tak, jak chcesz, ale bez implementacji nic się nie stanie. Pomyśl o JPA jako o wytycznych, których należy przestrzegać lub o interfejsie, podczas gdy implementacja JPA Hibernate jest kodem, który spełnia API zdefiniowane w specyfikacji JPA i zapewnia funkcjonalność pod maską.

Kiedy używasz Hibernacji z JPA, faktycznie używasz implementacji Hibernacji JPA. Zaletą tego jest to, że można zamienić implementację JPA Hibernate na inną implementację specyfikacji JPA. Kiedy używasz prostej hibernacji, blokujesz się w implementacji, ponieważ inne ORM mogą używać różnych metod / konfiguracji i adnotacji, dlatego nie możesz po prostu przełączyć się na inną ORM.

Aby uzyskać bardziej szczegółowy opis, przeczytaj mój wpis na blogu .


5
Kiedy więc używasz Hibernacji z JPA, adnotacje {java.persistence} będą działać, czy będziesz musiał użyć adnotacji {org.hibernate}?
Amruta,

62
Chciałem tylko dodać, że zamiana jednego ORM na inny jest bardzo rzadką okazją, więc prawdopodobnie nigdy nie uzyskasz tej korzyści z używania JPA. Z JPA zyskujesz protokół, standardy, nazewnictwo i inne konwencje, których możesz używać do komunikowania się z innymi.
pubsy

3
@pubsy Zgadzam się, ale w zasadzie jest to jeden z punktów sprzedaży specyfikacji.
Kevin Bowersox

6
@Amruta, aby odpowiedzieć na twoje pytanie, gdy ktoś używa Hibernacji z JPA, adnotacje {java.persistence} będą działać i nie trzeba używać adnotacji {org.hibernate}.
Uczeń

3
@JavaGeek to prawda, o ile kod użytkownika używa tylko interfejsu wymienionego w JPA. Jeśli ktoś używa funkcji specyficznych dla hibernacji, musi użyć org.hibernateadnotacji. więcej na ten temat
Suryavanshi

632

JPA to taniec, Hibernacja to tancerz.


189
JPA to sztuka, Hibernacja to artysta.
Lucky

10
Lubię to poczucie humoru :) JPA jest reżyserem, Hibernate jest aktorem.
user3278897,

7
ale tancerz (Hibernacja) może występować bez tańca (JPA), prawda: /
RevanthKrishnaKumar V.

3
Ta odpowiedź nic nie wyjaśnia, tylko niejasne powiedzenie.
Amir Kost

11
Ta metafora nie dodaje zrozumienia. Jeśli znasz już różnicę, przekonasz się, że to zadziwiające. Jeśli nie znasz różnicy, nadal jej nie znasz.
Nick Volynkin

158

Niektóre rzeczy są zbyt trudne do zrozumienia bez historycznej perspektywy języka i zrozumienia JCP.

Często są strony trzecie, które opracowują pakiety, które wykonują funkcję lub wypełniają lukę, które nie są częścią oficjalnego JDK. Z różnych powodów funkcja ta może stać się częścią JDK Java za pośrednictwem JCP (Java Community Process)

Hibernacja (w 2003 r.) Zapewniła sposób abstrakcyjnego SQL-a i pozwoliła deweloperom myśleć więcej w zakresie trwałych obiektów (ORM). Powiadamiasz hibernację o swoich obiektach Entity, a to automatycznie generuje strategię ich zachowania. Hibernacja dostarczyła implementację, aby to zrobić, oraz interfejs API do realizacji implementacji poprzez konfigurację XML lub adnotacje.

Podstawową kwestią jest teraz to, że Twój kod jest ściśle powiązany z konkretnym dostawcą (Hibernacja), co zdaniem wielu osób powinno być bardziej ogólne. Stąd potrzeba ogólnego API trwałości.

W międzyczasie JCP z dużą ilością danych wejściowych od Hibernate i innych dostawców narzędzi ORM rozwijał JSR 220 (Java Specification Request), co zaowocowało JPA 1.0 (2006) i ostatecznie JSR 317, czyli JPA 2.0 (2009). Są to specyfikacje ogólnego interfejsu API Java Persistence. Interfejs API jest dostarczany w JDK jako zestaw interfejsów, dzięki czemu twoje klasy mogą polegać na javax.persistence i nie martwić się o konkretnego dostawcę, który wykonuje zadanie utrwalania twoich obiektów. To tylko API, a nie implementacja. Hibernacja staje się teraz jednym z wielu dostawców, którzy implementują specyfikację JPA 2.0. Możesz kodować w kierunku JPA i wybierać dostawców ORM zgodnych z Twoimi potrzebami.

Są przypadki, w których Hibernacja może zapewnić funkcje, które nie są skodyfikowane w JPA. W takim przypadku możesz wybrać wstawienie adnotacji Hibernacji bezpośrednio do swojej klasy, ponieważ JPA nie zapewnia interfejsu do wykonania tej czynności.

Źródło: http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/


2
Dobra historia. podczas gdy inne odpowiedzi powtarzają tylko to, o co chodzi w pytaniu.
Robert

1
Dzięki za te pouczające szczegóły. Powiedziałeś, że JPA zostało zrobione, ponieważ aplikacje w połączeniu z Hibernacją wymagały abstrakcji, ok. Ale czy to nie jest nieskończony problem? Czy aplikacja nie jest teraz ściśle powiązana z JPA? Jaka jest tutaj prawdziwa korzyść? Widzę już Hibernację jako warstwę abstrakcji ...
Aphax,

4
@Aphax Pewnie, a kiedy kodujesz pliki .java, jesteś również ściśle powiązany z Javą, więc co jeśli jutro chcę przejść na Python?
Smutje

100

JPA jest interfejsem, podczas gdy Hibernacja jest implementacją.

Tradycyjnie istnieje wiele rozwiązań Java ORM:

każda implementacja definiuje własną definicję mapowania lub interfejs API klienta. Grupa ekspertów JPA zgromadziła najlepsze ze wszystkich tych narzędzi, dlatego opracowała standard Java Persistence API.

Standardowy interfejs API trwałości jest bardzo wygodny z punktu widzenia klienta, dzięki czemu stosunkowo łatwo można przełączać jedną implementację z drugą (chociaż w praktyce nie jest to takie proste, ponieważ w dużych projektach i tak trzeba korzystać z określonych niestandardowych funkcji) .

Standardowy JPA podniósł konkurencję Java ORM na nowy poziom, co może prowadzić tylko do lepszych implementacji.

Jak wyjaśniono w mojej książce High-Performance Java Persistence , Hibernate oferuje funkcje, które nie są jeszcze obsługiwane przez JPA :

Te dodatkowe funkcje pozwalają Hibernacji spełnić wiele wymagań dotyczących trwałości wymaganych przez duże aplikacje korporacyjne.


To jest dobre, nie wiedziałem wcześniej o innych narzędziach ORM
Avdhut,

Świetna odpowiedź i bardzo się cieszę z tej książki! Dzięki za wydanie!
JonasJSchreiber

Dzięki za skorzystanie z mojej książki o wysokiej wydajności Java Persistence .
Vlad Mihalcea

To ~ JPA jest interfejsem, podczas gdy Hibernacja jest implementacją
Eddie B

57

Z Wiki .

Motywacja do utworzenia interfejsu API Java Persistence

Wielu korporacyjnych programistów Java używa lekkich trwałych obiektów dostarczanych przez frameworki open source lub obiekty dostępu do danych zamiast komponentów bean encji: bean encji i bean korporacyjnych miał reputację zbyt ciężkiej i skomplikowanej i można ich używać tylko na serwerach aplikacji Java EE. Wiele funkcji zewnętrznych platform utrwalających zostało włączonych do Java Persistence API, a od 2006 r. Projekty takie jak Hibernate (wersja 3.2) i wersja Open Source TopLink Essentials stały się implementacjami Java Persistence API.

Jak powiedziano na stronie JCP, łącze Eclipse jest referencyjną implementacją JPA. Spójrz na tę odpowiedź, aby dowiedzieć się więcej na ten temat.

Samo JPA ma funkcje, które będą stanowić standardową strukturę ORM. Ponieważ JPA jest częścią specyfikacji Java EE, możesz używać samego JPA w projekcie i powinien on współpracować z dowolnymi serwerami kompatybilnymi z Java EE . Tak, serwery te będą miały implementacje do specyfikacji JPA.

Hibernacja jest najpopularniejszym frameworkiem ORM , po wprowadzeniu JPA hibernacja jest zgodna ze specyfikacjami JPA . Oprócz podstawowego zestawu specyfikacji, który powinien następować po hibernacji, zapewnia mnóstwo dodatkowych rzeczy.


3
To powiedziawszy, możesz używać JPA sam w projekcie. Czy masz na myśli bez używania Hibernacji, TopLink lub jakiejkolwiek innej implementacji JPA?
abbas

2
@abbas tak. Specyfikacja Java EE używa tylko JPA. Jeśli dodasz hibernację, zapewni on dodatkowe funkcje.
ManuPK,

1
Słyszałem, że JPA to tylko interfejs / specyfikacja. Jeśli używamy samego JPA w projekcie, to skąd bierze się jego wdrożenie?
abbas

@abbas dziękuję za komentarz. Dodałem więcej szczegółów w odpowiedzi. Mam nadzieję że to pomoże.
ManuPK,

1
@Forhad Zawsze musi istnieć implementacja, bez względu na to, czy jest zakopana w jakiejś architekturze serwera, czy nie, nie ma znaczenia, nie ma sposobu, aby pobrać bibliotekę JPA i sprawić, aby była trwała.
Kevin Bowersox

15

JPA to tylko specyfikacja, która wymaga konkretnego wdrożenia. Domyślna implementacja Oracle zapewniają to „EclipseLink” teraz. (Toplink jest przekazywany przez Oracle na rzecz fundacji Eclipse w celu połączenia z eclipselink)

(Odwołanie: http://www.oracle.com/technetwork/middleware/toplink/index-085257.html http://www.eclipse.org/org/press-release/20080317_Eclipselink.php )

Korzystając z Eclipselink, można mieć pewność, że kod jest przenośny dla dowolnej implementacji, jeśli zajdzie taka potrzeba. Hibernacja to także pełna implementacja JPA + WIĘCEJ (Rodzaj JPA Plus). Hibernacja to super zestaw JPA z dodatkowymi funkcjami specyficznymi dla Hibernacji. Dlatego aplikacja opracowana w Hibernacji może nie być kompatybilna po przełączeniu na inną implementację. Wciąż hibernacja jest wyborem większości programistów jako implementacji JPA i jest szeroko stosowana.

Inną implementacją JPA jest OpenJPA (openjpa.apache.org), która jest rozszerzeniem implementacji Kodo.


15

JPA: jest jak interfejs i nie ma konkretnej implementacji, aby używać funkcji, które są w JPA.

Hibernacja: jest tylko dostawcą JPA, który ma implementację funkcji w JPA i może mieć dodatkowe funkcje, których może nie być w JPA.

WSKAZÓWKA: możesz użyć

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 

Kombinacja 1 : jest używana, gdy czujesz, że hibernacja nie zapewnia lepszej wydajności i chcesz zmienić dostawcę JPA, kiedy nie musisz już pisać JPA. Możesz napisać innego dostawcę JPA ... i możesz zmieniać tyle razy, ile możesz.

Kombinacja 2 : jest używana bardzo rzadziej niż wtedy, gdy nie zamierzasz zmieniać dostawcy JPA za wszelką cenę.

Odwiedź http://blog-tothought.rhcloud.com//post/2 , gdzie twoje całkowite zamieszanie zostanie wyjaśnione.




5

JPA to tylko specyfikacja. Na rynku jest wielu dostawców, którzy implementują JPA. Różne typy dostawców wdrażają JPA w różny sposób. więc różne typy dostawców zapewniają różne funkcje, więc wybierz odpowiedniego dostawcę na podstawie swoich wymagań.

Jeśli używasz Hibernacji lub innych dostawców zamiast JPA, nie możesz łatwo przejść do hibernacji do EclipseLink lub OpenJPA do Hibernacji. Ale jeśli używasz JPA, musisz tylko zmienić plik XML trwałości. Tak więc migracja jest łatwo możliwa w JPA.


4

JPA to interfejs API, który implementuje Hibernacja. Hibernacja poprzedza JPA. Przed JPA piszesz natywny kod hibernacji, aby wykonać ORM. JPA to tylko interfejs, więc teraz piszesz kod JPA i musisz znaleźć implementację. Hibernacja bywa implementacją.

Masz więc do wyboru: hibernację, górny link itp.

Zaletą JPA jest to, że pozwala w razie potrzeby wymienić swoją implementację. Wadą jest to, że natywny interfejs hibernacji / toplink / etc ... API może oferować funkcje, których nie obsługuje specyfikacja JPA.


4

Podczas gdy JPA jest specyfikacją, Hibernate jest dostawcą implementacji, który przestrzega reguł podanych w specyfikacji.


3

Java - jego niezależność jest nie tylko od systemu operacyjnego, ale także od dostawcy.

Dlatego powinieneś być w stanie wdrożyć aplikację na różnych serwerach aplikacji. JPA jest implementowany na dowolnym serwerze aplikacji zgodnym z Java EE i umożliwia wymianę serwerów aplikacji, ale wtedy implementacja również się zmienia. Aplikacja Hibernacja może być łatwiejsza do wdrożenia na innym serwerze aplikacji.


3

JPA to specyfikacja implementowana w warstwie danych w celu wykonywania operacji db, mapowań OR i innych wymaganych zadań.

Ponieważ jest to tylko specyfikacja , potrzebujesz narzędzia, aby ją wdrożyć. Narzędziem tym może być Hibernacja, TopLink, iBatis, dane wiosenne itp.

Niekoniecznie potrzebujesz JPA, jeśli używasz Hibernacji w Warstwie Danych. Ale jeśli użyjesz specyfikacji JPA dla Hibernacji, ułatwi to w przyszłości przejście do innych narzędzi ORM, takich jak iBatis, TopLink, ponieważ specyfikacja jest wspólna również dla innych.

* ( jeśli pamiętasz, robisz to, import javax.persistence.*;gdy używasz adnotacji do mapowania LUB (np. @Id, @Column, @GeneratedValue itp.) w Hibernacji, to tam używasz JPA w Hibernacji, możesz użyć JPA @Query i innych funkcji jako dobrze )


2

JPA to specyfikacja API Java, która opisuje zarządzanie relacyjnymi danymi w aplikacjach korzystających z platformy Java. gdzie jako Hibernacja jest biblioteka ORM (Object Relational Mapping) zgodna ze specyfikacją JPA.

Możesz myśleć o JPA jako zestawie reguł, który jest implementowany przez Hibernację.


2

JPA to JSR, tj. Java Specification Requirement do wdrożenia Object Relational Mapping, który nie ma określonego kodu do jego implementacji. Definiuje pewien zestaw reguł dostępu do danych między obiektami Java i relacyjną bazą danych oraz zarządzania nimi i zarządzania nimi. Wraz z jego wprowadzeniem EJB został zastąpiony, ponieważ został skrytykowany przez społeczność programistów Java. Hibernacja jest jednym ze sposobów implementacji JPA przy użyciu tych wytycznych. Hibernate to wysokowydajna usługa Object / Relational trwałości i zapytań, która jest licencjonowana na licencji GNU Lesser General Public License (LGPL). Korzyścią z tego jest to, że może zamienić implementację JPA Hibernate na inną implementację specyfikacji JPA.


1

JPA to tylko specyfikacja, która wymaga konkretnego wdrożenia. Domyślną implementacją dostarczaną przez oracle jest teraz „Eclipselink”. Toplink jest przekazywany przez Oracle na rzecz fundacji Eclipse w celu połączenia z eclipselink.

Korzystając z Eclipselink, można mieć pewność, że kod jest przenośny dla dowolnej implementacji, jeśli zajdzie taka potrzeba. Hibernacja to także pełna implementacja JPA + WIĘCEJ. Hibernacja to super zestaw JPA z dodatkowymi funkcjami specyficznymi dla Hibernacji. Dlatego aplikacja opracowana w Hibernacji może nie być kompatybilna po przełączeniu na inną implementację. Wciąż hibernacja jest wyborem większości programistów jako implementacji JPA i jest szeroko stosowana.

Inną implementacją JPA jest OpenJPA, która jest rozszerzeniem implementacji Kodo.

JPA vs Hibernacja


1

Próbuję wyjaśnić bardzo prostymi słowami.

Załóżmy, że potrzebujesz samochodu, ponieważ wszyscy wiemy, że jest kilku producentów klasy A, takich jak MERCEDES, BMW, AUDI itp.

Teraz w powyższym stwierdzeniu CAR (to specyfikacja), ponieważ każdy samochód ma wspólne cechy, takie jak 4 koła i można nim jeździć po drodze samochodem ... więc jest jak JPA. A MERCEDES, BMW, AUDI itp. Używają tylko wspólnej funkcji samochodu i dodają funkcjonalność zgodnie z bazą klientów, więc wdrażają specyfikację samochodu, taką jak hibernacja, iBATIS itp.

Więc przez te wspólne funkcje przechodzi do jpa, a hibernacja jest tylko implementacją zgodną z ich potrzebą jboss.

Jeszcze 1 rzecz

JPA zawiera kilka podstawowych właściwości, więc jeśli chcesz zmienić hibernację na dowolną inną implementację, możesz łatwo przełączyć się bez większego bólu głowy, a dla tych podstawowych właściwości znajdują się adnotacje JPA, które mogą działać dla dowolnej technologii implementacji, zapytania JPQL.

Dlatego głównie wdrażamy hibernację z technologią typu JPA na wypadek, gdybyśmy chcieli zmienić naszą implementację zgodnie z potrzebami klienta, a także napisać mniej kodu, ponieważ niektóre wspólne funkcje są zaangażowane w JPA. Jeśli ktoś nadal nie jest pewien, możesz skomentować jako przepełniony stos.

Dziękuję Ci


Dzięki za radę
rajiv baghel

0

JPA jest tylko specyfikacją, podczas gdy Hibernacja jest jednym z dostawców JPA, tj. Hibernacja implementuje różne rzeczy wymienione w kontrakcie JPA.


0

JPA lub Java Persistence API to standardowa specyfikacja dla implementacji ORM, podczas gdy Hibernacja jest faktyczną implementacją lub strukturą ORM.


-1

JPA to Java Persistence API. Który określa tylko specyfikacje interfejsów API. Oznacza, że ​​zestaw reguł i wytycznych dotyczących tworzenia interfejsów API. Jeśli mówi inny kontekst, to zestaw standardów, który zapewnia opakowanie do tworzenia tych interfejsów API, może być używany do uzyskiwania dostępu do obiektu obiektu z bazy danych. JPA jest dostarczany przez oracle. Kiedy zamierzamy uzyskać dostęp do bazy danych, zdecydowanie potrzebujemy jej implementacji. Oznacza, że ​​JPA określa tylko wytyczne dotyczące implementacji interfejsów API. Hibernate to dostawca / dostawca JPA, który jest odpowiedzialny za wdrożenie tych interfejsów API. Podobnie jak Hibernate TopLink i Open JPA to niektóre przykłady dostawców API JPA. Używamy więc standardowych interfejsów API określonych przez JPA poprzez hibernację.


-2

W przenośni JPA to po prostu interfejs Hibernate / TopLink - klasa (tj. Implementacja interfejsu).

Aby móc korzystać z interfejsu, musisz mieć implementację interfejsu. Ale możesz użyć klasy poprzez interfejs, tj. Użyć Hibernacji poprzez API JPA lub możesz użyć implementacji bezpośrednio, tj. Użyć Hibernacji bezpośrednio, a nie poprzez czysty interfejs JPA API.

Dobra książka o JPA to „High-Performance Java Persistence” Vlada Mihalcei.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.