Qual è la differenza tra JPA e Hibernate? [chiuso]


680

Capisco che JPA 2 è una specifica e Hibernate è uno strumento per ORM. Inoltre, capisco che Hibernate ha più funzionalità di JPA 2. Ma da un punto di vista pratico, qual è davvero la differenza?

Ho esperienza con iBatis e ora sto cercando di imparare Hibernate o JPA2. Ho preso il libro Pro JPA2 e continua a fare riferimento a "provider JPA". Per esempio:

Se ritieni che una funzionalità debba essere standardizzata, dovresti parlare e richiederla al tuo provider JPA

Questo mi confonde, quindi ho alcune domande:

  • Utilizzando JPA2 da solo posso recuperare i dati dal DB semplicemente annotando i miei POJO
  • Si suppone che JPA2 sia utilizzato con un "provider JPA", ad esempio TopLink o Hibernate? In tal caso, quali sono i vantaggi dell'utilizzo di JPA2 + Hibernate rispetto a JPA2 da solo o rispetto a Hibernate da solo?
  • Puoi consigliarmi un buon libro pratico JPA2. "Pro JPA2" sembra più una bibbia e un riferimento su JPA2 (non arriva alle query fino alla metà successiva del libro). Esiste un libro che adotta un approccio problema / soluzione a JPA2?

2
La domanda su "la differenza tra JPA e Hibernate" non è corretta. Battle Hibernate vs JPA è inutile. È consigliabile utilizzare qualsiasi implementazione di JPA con API JPA per evitare l'implementazione di ORM diversi.
BERGUIGA Mohamed Amine,

18
@ Berguiga.M.Amine, Se siamo già stati a conoscenza del fatto che la domanda precedente non è corretta. Non abbiamo più bisogno di chiedere. Mi interessa anche questo argomento.
Fai Nhu Vy il

Ho una confusione con JpaTemplate usato in primavera "org.springframework.orm.jpa.JpaTemplate" ha le sue funzioni come persist (), find (), merge () ecc.quindi come funzionano le cose senza ibernazione?
nitin verma,

@nitinverma: questa è davvero una domanda separata. Se hai ancora bisogno di una risposta, ti suggerisco di porre la tua domanda separatamente per attirare più feedback.
Wouter,

Risposte:


776

Come si afferma JPA è solo una specifica, il che significa che non c'è implementazione. Puoi annotare le tue lezioni quanto desideri con le annotazioni JPA, tuttavia senza un'implementazione non accadrà nulla. Pensa a JPA come alle linee guida che devono essere seguite o a un'interfaccia, mentre l'implementazione JPA di Hibernate è un codice che soddisfa l'API come definito dalla specifica JPA e fornisce la funzionalità sottostante.

Quando si utilizza Hibernate con JPA, in realtà si sta utilizzando l'implementazione di Hibernate JPA. Il vantaggio di ciò è che è possibile scambiare l'implementazione di JPA di Hibernate con un'altra implementazione della specifica JPA. Quando si utilizza l'ibernazione diretta, si sta bloccando l'implementazione perché altri ORM possono utilizzare metodi / configurazioni e annotazioni diversi, pertanto non è possibile passare a un altro ORM.

Per una descrizione più dettagliata leggi il mio blog .


5
Quindi, quando stai usando Hibernate con JPA, le annotazioni {java.persistence} funzioneranno o dovrai usare le annotazioni {org.hibernate}?
Amruta,

62
Volevo solo aggiungere che sostituire un ORM con uno diverso è un'occasione molto rara, quindi probabilmente non trarrai mai questo vantaggio dall'uso di JPA. Quello che ottieni con JPA è un protocollo, standard, denominazione e altre convenzioni che puoi usare per comunicare con gli altri.
pubsy,

3
@pubsy Sono d'accordo, ma in linea di principio è uno dei punti di forza di una specifica.
Kevin Bowersox,

6
@Amruta per rispondere alla tua domanda, quando si utilizza Hibernate con JPA, le annotazioni {java.persistence} funzioneranno e non è necessario utilizzare le annotazioni {org.hibernate}.
Studente

3
@JavaGeek è vero fintanto che il proprio codice utilizza solo l'interfaccia menzionata in JPA. Se si utilizzano funzionalità specifiche per l'ibernazione, è necessario utilizzare l' org.hibernateannotazione. altro su questo
Suryavanshi

632

JPA è la danza, Hibernate è la ballerina.


189
JPA è l'arte, Hibernate è l'artista.
Lucky

10
Mi piace questo senso dell'umorismo :) JPA è un regista, Hibernate è un attore.
user3278897,

7
ma Dancer (Hibernate) può esibirsi senza danza (JPA) no: /
RevanthKrishnaKumar V.

3
Questa risposta non spiega nulla, solo un vago detto.
Amir Kost

11
Questa metafora non aggiunge comprensione. Se conosci già la differenza, la troverai stupefacente. Se non conosci la differenza, non lo saprai ancora.
Nick Volynkin,

158

Alcune cose sono troppo difficili da capire senza una prospettiva storica della lingua e della comprensione del JCP.

Spesso ci sono terze parti che sviluppano pacchetti che svolgono una funzione o colmano una lacuna che non fa parte del JDK ufficiale. Per vari motivi questa funzione può diventare parte del JDK Java attraverso il JCP (Java Community Process)

Hibernate (nel 2003) ha fornito un modo per astrarre SQL e consentire agli sviluppatori di pensare di più in termini di oggetti persistenti (ORM). Si avvisa l'ibernazione degli oggetti Entity e genera automaticamente la strategia per mantenerli. Hibernate ha fornito un'implementazione per fare questo e l'API per guidare l'implementazione tramite configurazione XML o annotazioni.

Il problema fondamentale ora è che il codice viene strettamente associato a un fornitore specifico (Hibernate) per ciò che molte persone pensavano che fosse più generico. Da qui la necessità di un'API di persistenza generica.

Nel frattempo, il JCP con molti input da parte di Hibernate e di altri produttori di strumenti ORM stava sviluppando JSR 220 (Java Specification Request) che ha portato a JPA 1.0 (2006) e infine a JSR 317 che è JPA 2.0 (2009). Queste sono le specifiche di un'API Java Persistence generica. L'API viene fornita in JDK come un insieme di interfacce in modo che le classi possano dipendere da javax.persistence e non preoccuparsi del particolare fornitore che sta facendo il lavoro di persistenza dei propri oggetti. Questa è solo l'API e non l'implementazione. Hibernate ora diventa uno dei molti fornitori che implementano la specifica JPA 2.0. Puoi programmare verso JPA e scegliere qualsiasi fornitore ORM conforme alle tue esigenze.

Ci sono casi in cui Hibernate può fornirti funzionalità che non sono codificate in JPA. In questo caso, puoi scegliere di inserire un'annotazione specifica Hibernate direttamente nella tua classe poiché JPA non fornisce l'interfaccia per fare ciò.

Fonte: http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/


2
Buona parte della storia. mentre altre risposte stanno solo ripetendo ciò che è nella domanda.
Robert,

1
Grazie per le precisazioni illuminanti. Hai detto che l'APP è stato fatto perché le applicazioni erano strettamente associate a Hibernate, era una necessità di astrazione, ok. Ma non è un problema infinito? L'applicazione non è ora strettamente accoppiata a JPA? Qual è il vero vantaggio qui? Vedo già l'ibernazione come uno strato di astrazione ...
Aphax,

4
@Aphax Certo, e quando codifichi i file .java sei anche strettamente accoppiato a Java, quindi se volessi passare a Python domani?
Smutje,

100

JPA è l'interfaccia mentre Hibernate è l'implementazione.

Tradizionalmente esistevano più soluzioni Java ORM:

ogni implementazione che definisce la propria definizione di mapping o API client. Il gruppo di esperti JPA ha raccolto il meglio di tutti questi strumenti e ha quindi creato lo standard API Java Persistence.

Un'API di persistenza standard è molto comoda dal punto di vista del cliente, rendendo relativamente semplice il passaggio da un'implementazione all'altra (anche se in pratica non è così semplice perché su progetti di grandi dimensioni dovrai comunque utilizzare specifiche funzionalità non standard) .

Il JPA standard ha spinto la concorrenza di Java ORM a un nuovo livello e questo non può che portare a migliori implementazioni.

Come spiegato nel mio libro, Persistenza ad alte prestazioni Java , Hibernate offre funzionalità che non sono ancora supportate da JPA :

Queste funzionalità extra consentono a Hibernate di soddisfare molti requisiti di persistenza richiesti dalle grandi applicazioni aziendali.


Questo è buono, non sapevo di altri strumenti ORM prima
Avdhut,

Ottima risposta e mi sto godendo il libro tremendamente! Grazie per averlo rilasciato!
JonasJSchreiber,

Grazie per aver apprezzato il mio libro Java Persistence ad alte prestazioni .
Vlad Mihalcea,

Questo ~ JPA è l'interfaccia mentre Hibernate è l'implementazione
Eddie B

57

Dal Wiki .

Motivazione per la creazione dell'API Java Persistence

Molti sviluppatori Java aziendali utilizzano oggetti persistenti leggeri forniti da framework open source o Data Access Objects invece di bean di entità: i bean di entità e i bean di impresa avevano la reputazione di essere troppo pesanti e complicati e si potevano usare solo nei server di applicazioni Java EE. Molte delle funzionalità dei framework di persistenza di terze parti sono state incorporate nell'API Java Persistence e, a partire dal 2006, progetti come Hibernate (versione 3.2) e TopLink Essentials versione Open Source sono diventati implementazioni dell'API Java Persistence.

Come indicato nella pagina JCP, il collegamento Eclipse è l'implementazione di riferimento per JPA. Dai un'occhiata a questa risposta per saperne di più su questo.

JPA stesso ha funzionalità che compenseranno un framework ORM standard. Poiché JPA fa parte delle specifiche Java EE, è possibile utilizzare JPA da solo in un progetto e dovrebbe funzionare con qualsiasi server compatibile Java EE . Sì, questi server avranno le implementazioni per le specifiche JPA.

Hibernate è il framework ORM più popolare , una volta introdotto l' APP hibernate è conforme alle specifiche JPA . A parte il set di specifiche di base che dovrebbe seguire l'ibernazione fornisce molte altre cose.


3
Detto questo, puoi usare JPA da solo in un progetto. Intendi senza usare Hibernate, TopLink o qualsiasi altra implementazione JPA?
abbas,

2
@abbas yes. Le specifiche Java EE utilizzano solo JPA. Se aggiungi l'ibernazione, fornisce alcune funzionalità aggiuntive.
ManuPK,

1
Ho sentito che JPA è solo un'interfaccia / specifica. Se utilizziamo JPA da solo in un progetto, da dove viene la sua implementazione?
abbas,

@abbas grazie per il commento. Ho aggiunto ulteriori dettagli nella risposta. Spero che sia di aiuto.
ManuPK,

1
@Forhad Deve sempre esserci un'implementazione, che sia sepolta in qualche architettura server o no, non importa, non c'è modo di scaricare solo una libreria JPA e farla perseguire per te.
Kevin Bowersox,

15

L'APP è solo una specifica che richiede un'implementazione concreta. L' oracolo di implementazione predefinito fornisce ora "Eclipselink". (Toplink è donato da Oracle alla fondazione Eclipse per fondersi con eclipselink)

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

Utilizzando Eclipselink, si può essere certi che il codice sia portatile per qualsiasi implementazione in caso di necessità. Hibernate è anche un'implementazione JPA completa + ALTRO (Sort of JPA Plus). Hibernate è un super set di JPA con alcune funzionalità specifiche di Hibernate extra. Pertanto, l'app sviluppata in Hibernate potrebbe non essere compatibile quando si passa a un'altra implementazione. Ancora in letargo è la scelta della maggior parte degli sviluppatori come implementazione JPA e ampiamente utilizzata.

Un'altra implementazione di JPA è OpenJPA (openjpa.apache.org) che è un'estensione dell'implementazione di Kodo.


15

JPA: è proprio come un'interfaccia e non ha una sua implementazione concreta per utilizzare le funzioni presenti in JPA.

Sospensione: è solo un provider JPA che ha l'implementazione delle funzioni in JPA e può avere alcune funzioni extra che potrebbero non essere presenti in JPA.

SUGGERIMENTO: è possibile utilizzare

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

Combo 1 : viene utilizzato quando ritieni che il tuo letargo non fornisca prestazioni migliori e desideri cambiare il provider JPA in quel momento in cui non devi scrivere nuovamente il tuo JPA. È possibile scrivere un altro provider JPA ... e modificare il maggior numero di volte possibile.

Combo 2 : è usato molto meno come quando non hai intenzione di cambiare il tuo provider JPA ad ogni costo.

Visita http://blog-tothought.rhcloud.com//post/2 , dove la tua completa confusione diventerà chiara.


11

JPA è l'interfaccia, Hibernate è un'implementazione di quell'interfaccia.


2
e per di più, Hibernate aggiunge alcune altre funzionalità / metodi.
rai.skumar,


5

JPA è solo una specifica. Nel mercato ci sono molti venditori che implementano JPA. Diversi tipi di fornitori implementano JPA in modo diverso. quindi diversi tipi di fornitori offrono funzionalità diverse, quindi scegli il fornitore giusto in base alle tue esigenze.

Se stai usando Hibernate o qualsiasi altro fornitore al posto di JPA di quanto non puoi facilmente passare in letargo a EclipseLink o OpenJPA a Hibernate.Ma se usi JPA che devi solo cambiare fornire nel file XML di persistenza. Quindi la migrazione è facilmente possibile in JPA.


4

JPA è un'API, quella implementata da Hibernate, che precede JPA. Prima di JPA, scrivi il codice di ibernazione nativo per eseguire il tuo ORM. JPA è solo l'interfaccia, quindi ora scrivi il codice JPA e devi trovare un'implementazione. L'ibernazione sembra essere un'implementazione.

Quindi le tue scelte sono queste: ibernazione, toplink, ecc ...

Il vantaggio di JPA è che ti consente di scambiare l'implementazione se necessario. Lo svantaggio è che l'API nativa ibernazione / toplink / etc ... può offrire funzionalità che la specifica JPA non supporta.


4

Mentre JPA è la specifica, Hibernate è il fornitore di implementazione che segue le regole dettate nella specifica.


3

Java: la sua indipendenza non è solo dal sistema operativo, ma anche dal fornitore.

Pertanto, dovresti essere in grado di distribuire l'applicazione su diversi server applicazioni. JPA è implementato in qualsiasi server di applicazioni compatibile con Java EE e consente di scambiare i server di applicazioni, ma anche l'implementazione sta cambiando. Un'applicazione di ibernazione potrebbe essere più semplice da distribuire su un altro server delle applicazioni.


3

JPA è una specifica implementata nel livello dati per eseguire operazioni db, mapping OR e altre attività richieste.

Dal momento che è solo una specifica , è necessario uno strumento per averlo implementato. Questo strumento può essere Hibernate, TopLink, iBatis, spring-data ecc.

Non si richiede necessariamente JPA se si utilizza Hibernate nel proprio livello dati. Ma se usi la specifica JPA per Hibernate, in futuro renderai facile passare ad altri strumenti ORM come iBatis, TopLink, perché la specifica è comune anche per altri.

* ( se ricordi, import javax.persistence.*;quando usi le annotazioni per il mapping OR (come @Id, @Column, @GeneratedValue ecc.) in Hibernate, è lì che stai usando JPA sotto Hibernate, puoi usare @Query di JPA e altre funzionalità come bene )


2

JPA è una specifica API Java che descrive la gestione dei dati relazionali nelle applicazioni che utilizzano la piattaforma Java. dove Hibernate è una libreria ORM (Object Relational Mapping) che segue le specifiche JPA.

Puoi pensare all'APP come a un insieme di regole implementate da Hibernate.


2

JPA è JSR, ovvero i requisiti delle specifiche Java per implementare la mappatura relazionale degli oggetti che non ha un codice specifico per la sua implementazione. Definisce un determinato insieme di regole per l'accesso, la persistenza e la gestione dei dati tra oggetti Java e il database relazionale. Con la sua introduzione, EJB è stato sostituito in quanto criticato dalla comunità di sviluppatori Java. Hibernate è uno dei modi in cui JPA può essere implementato usando le linee guida. Hibernate è un servizio di persistenza / query oggetti / relazioni ad alte prestazioni che è concesso in licenza con la GNU Lesser General Public License (LGPL) open source. Il vantaggio di questo è che tu può sostituire l'implementazione dell'APP di Hibernate con un'altra implementazione della specifica dell'APP.


1

L'APP è solo una specifica che richiede un'implementazione concreta. L'implementazione predefinita fornita da Oracle è "Eclipselink" ora. Toplink è donato da Oracle alla fondazione Eclipse per fondersi con eclipselink.

Utilizzando Eclipselink, si può essere certi che il codice sia portatile per qualsiasi implementazione in caso di necessità. Hibernate è anche un'implementazione JPA completa + ALTRO. Hibernate è un super set di JPA con alcune funzionalità specifiche di Hibernate extra. Pertanto, l'applicazione sviluppata in Hibernate potrebbe non essere compatibile quando si passa a un'altra implementazione. Ancora in letargo è la scelta della maggior parte degli sviluppatori come implementazione JPA e ampiamente utilizzata.

Un'altra implementazione di JPA è OpenJPA, che è un'estensione dell'implementazione di Kodo.

JPA vs Hibernate


1

Cerco di spiegare con parole molto semplici.

Supponiamo che tu abbia bisogno di un'auto come sappiamo tutti che sono diversi produttori di classe A come MERCEDES, BMW, AUDI ecc.

Ora nella dichiarazione sopra CAR (è una specifica) in quanto ogni auto ha caratteristiche comuni come cosa con 4 ruote e può essere guidata su strada è auto ... quindi è come JPA. E MERCEDES, BMW, AUDI ecc. Stanno solo usando le caratteristiche comuni dell'auto e aggiungendo funzionalità in base alla loro base di clienti, quindi stanno implementando le specifiche dell'auto come ibernazione, iBATIS ecc.

Quindi con queste caratteristiche comuni va a jpa e l'ibernazione è solo un'implementazione in base alle loro necessità di jboss.

1 altra cosa

JPA include alcune proprietà di base, quindi in futuro, se si desidera cambiare l'ibernazione con qualsiasi altra implementazione, è possibile passare facilmente senza troppi mal di testa e per tali proprietà di base sono incluse le annotazioni JPA che possono funzionare con qualsiasi tecnologia di implementazione, query JPQL.

Quindi principalmente implementiamo l'ibernazione con la tecnologia di tipo JPA solo nel caso in cui vogliamo cambiare la nostra implementazione in base alle esigenze del cliente, inoltre scriverai meno codice poiché alcune funzionalità comuni sono coinvolte in JPA. Se qualcuno ancora non cancella, puoi commentare come nuovo nello stack overflow.

Grazie


Grazie per il consiglio
rajiv baghel,

0

JPA è solo una specifica mentre Hibernate è uno dei fornitori di JPA, ovvero ibernazione sta implementando varie cose menzionate nel contratto JPA.


0

L'API di persistenza JPA o Java è una specifica standard per le implementazioni ORM mentre Hibernate è l'implementazione o il framework ORM effettivi.


-1

JPA è l'API Java Persistence. Che specifica solo le specifiche per le API. Significa che l'insieme di regole e linee guida per la creazione delle API. Se dice un altro contesto, è un insieme di standard che fornisce il wrapper per la creazione di tali API, che può essere utilizzato per accedere all'oggetto entità dal database. JPA è fornito da Oracle. Quando avremo accesso al database, abbiamo sicuramente bisogno della sua implementazione. Significa che JPA specifica solo le linee guida per l'implementazione delle API. Hibernate è un fornitore / fornitore JPA responsabile dell'implementazione di tali API. Come Hibernate TopLink e Open JPA sono alcuni esempi di provider di API JPA. Quindi utilizziamo le API standard specificate dall'APP tramite l'ibernazione.


-2

In termini figurativi, JPA è solo interfaccia, classe Hibernate / TopLink (ovvero implementazione dell'interfaccia).

È necessario disporre dell'implementazione dell'interfaccia per utilizzare l'interfaccia. Ma puoi usare la classe attraverso l'interfaccia, ad esempio Usa Hibernate tramite l'API JPA oppure puoi usare l'implementazione direttamente, cioè usare Hibernate direttamente, non attraverso l'API JPA pura.

Un buon libro su JPA è "Persistenza Java ad alte prestazioni" di Vlad Mihalcea.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.