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?
Odpowiedzi:
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 .
źródło
org.hibernate
adnotacji. więcej na ten tematJPA to taniec, Hibernacja to tancerz.
źródło
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/
źródło
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 :
@SQLInsert
,@SQLUpdate
,@SQLDelete
) oświadczenia@FilterDef
,@Filter
,@Where
) i filtry podmiot (np@Where
)@Formula
)@Immutable
)FlushMode.MANUAL
,FlushMode.ALWAYS
)Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
)@OptimisticLock(excluded = true)
)OptimisticLockType.ALL
,OptimisticLockType.DIRTY
)@Where
,@Filter
)Te dodatkowe funkcje pozwalają Hibernacji spełnić wiele wymagań dotyczących trwałości wymaganych przez duże aplikacje korporacyjne.
źródło
Z Wiki .
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.
źródło
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.
źródło
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ć
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.
źródło
JPA to interfejs, Hibernacja to jedna implementacja tego interfejsu.
źródło
JPA to specyfikacja standaryzująca interfejsy API ORM. Hibernacja jest dostawcą implementacji JPA. Więc jeśli używasz JPA z hibernacją, możesz użyć standardowego JPA API, hibernacja będzie pod maską, oferując więcej niestandardowych funkcji. Zobacz http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/ i http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/
źródło
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.
źródło
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.
źródło
Podczas gdy JPA jest specyfikacją, Hibernate jest dostawcą implementacji, który przestrzega reguł podanych w specyfikacji.
źródło
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.
źródło
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 )źródło
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ę.
źródło
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.
źródło
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
źródło
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
źródło
JPA jest tylko specyfikacją, podczas gdy Hibernacja jest jednym z dostawców JPA, tj. Hibernacja implementuje różne rzeczy wymienione w kontrakcie JPA.
źródło
JPA lub Java Persistence API to standardowa specyfikacja dla implementacji ORM, podczas gdy Hibernacja jest faktyczną implementacją lub strukturą ORM.
źródło
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ę.
źródło
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.
źródło