La differenza tra JPA, Hibernate ed EclipseLink

1. Introduzione

In questo tutorial, discuteremo di Hibernate e Java Persistence API (JPA), concentrandoci sulle differenze tra loro.

Ci Iniziamo esplorando ciò che APP è, come viene usato, ei concetti di base dietro di esso.

Quindi, daremo un'occhiata a come Hibernate ed EclipseLink si inseriscono nell'immagine.

2. Mappatura relazionale a oggetti

Prima di immergerci in JPA, è importante comprendere il concetto di Object-Relational Mapping, noto anche come ORM.

La mappatura relazionale degli oggetti è semplicemente il processo di persistenza di qualsiasi oggetto Java direttamente in una tabella di database . Di solito, il nome dell'oggetto che viene reso persistente diventa il nome della tabella e ogni campo all'interno di quell'oggetto diventa una colonna. Con la tabella impostata, ogni riga corrisponde a un record nell'applicazione.

3. Un'introduzione all'APP

Java Persistence API, o JPA, è una specifica che definisce la gestione dei dati relazionali in un'applicazione Java. L'API mappa una serie di concetti che definisce quali oggetti all'interno dell'applicazione devono essere mantenuti e come devono essere mantenuti.

È importante notare qui che JPA è solo una specifica e che necessita di un'implementazione per funzionare , ma ne parleremo più avanti.

Ora, discutiamo alcuni dei concetti chiave JPA che un'implementazione deve coprire.

3.1. Entità

La classe javax.persistence.Entity definisce quali oggetti devono essere persistenti nel database . Per ogni entità persistente, JPA crea una nuova tabella all'interno del database scelto.

Inoltre, tutte le entità scelte devono definire una chiave primaria indicata dall'annotazione @Id . Insieme all'annotazione @GeneratedValue , definiamo che la chiave primaria deve essere generata automaticamente quando il record viene mantenuto nel database.

Diamo un'occhiata a un rapido esempio di un'entità descritta da JPA.

@Entity public class Car { @GeneratedValue @Id public long id; // getters and setters } 

Ricorda, questo attualmente non avrà alcun effetto sull'applicazione: JPA non fornisce alcun codice di implementazione.

3.2. Persistenza sul campo

Un altro concetto fondamentale dell'APP è la persistenza sul campo . Quando un oggetto in Java viene definito come un'entità, tutti i campi al suo interno vengono automaticamente mantenuti come colonne diverse all'interno della tabella delle entità.

Se c'è un campo all'interno di un oggetto persistente che non vogliamo persistere nel database, possiamo dichiarare il campo transitorio con l' annotazione @Transient .

3.3. Relazioni

Successivamente, JPA specifica come dovremmo gestire le relazioni tra le diverse tabelle di database all'interno della nostra applicazione. Come abbiamo visto, JPA gestisce questo con le annotazioni. Ci sono quattro annotazioni di relazione che dobbiamo tenere a mente:

  1. @Uno a uno
  2. @OneToMany
  3. @ManyToOne
  4. @ManyToMany

Diamo un'occhiata a come funziona:

@Entity public class SteeringWheel { @OneToOne private Car car // getters and setters }

Nel nostro esempio sopra, la classe SteeringWheel descrive una relazione uno a uno con la nostra classe Auto di prima.

3.4. Entity Manager

Infine, la classe javax.persistence.EntityManager specifica le operazioni da e verso il database. L'EntityManager contiene comuni Create, Read, Update e le operazioni di eliminazione (CRUD) che sono persistenti al database.

4. Implementazioni JPA

Con la specifica JPA che definisce come e cosa dovremmo persistere, ora dobbiamo scegliere un fornitore di implementazione per fornire il codice necessario . Senza un tale provider, avremmo bisogno di implementare tutte le classi rilevanti per conformarci a JPA, e questo è molto lavoro!

Ci sono molti fornitori tra cui scegliere, ognuno dei quali mostra i propri pro e contro. Quando si prende una decisione su quale utilizzare, è necessario considerare alcuni dei seguenti punti :

  1. Maturità del progetto: da quanto tempo esiste il fornitore e quanto è ben documentato?
  2. Sottoprogetti: il provider dispone di sottoprogetti utili per la nostra nuova applicazione?
  3. Supporto della comunità: c'è qualcuno che ci aiuti quando ci ritroviamo con un bug critico ?
  4. Benchmarking: quanto è efficiente l'implementazione?

Sebbene non andremo in profondità sul benchmarking di diversi fornitori di JPA, JPA Performance Benchmark (JPAB) contiene informazioni preziose al riguardo.

Detto questo, diamo una breve occhiata ad alcuni dei principali fornitori di JPA.

5. Ibernazione

Essenzialmente, Hibernate è uno strumento di mappatura relazionale a oggetti che fornisce un'implementazione di JPA . Hibernate è una delle implementazioni JPA più mature in circolazione, con un'enorme comunità che sostiene il progetto.

Implementa tutto il javax.persistenceclassi che abbiamo esaminato in precedenza nell'articolo, oltre a fornire funzionalità oltre JPA: strumenti di ibernazione, convalida e ricerca. Sebbene queste API specifiche di Hibernate possano essere utili, non sono necessarie nelle applicazioni che richiedono solo la funzionalità JPA di base.

Diamo una rapida occhiata a ciò che offre Hibernate con l' annotazione @Entity .

Durante l'adempimento del contratto JPA, @ org.hibernate.annotations.Entity aggiunge metadati aggiuntivi che vanno oltre la specifica JPA. In questo modo è possibile ottimizzare la persistenza dell'entità. Ad esempio, diamo un'occhiata ad alcune annotazioni offerte da Hibernate che estendono le funzionalità di @Entity :

  1. @Table : ci consente di specificare il nome della tabella creata per l'entità
  2. @BatchSize : specifica la dimensione del batch quando si recuperano le entità dalla tabella

Vale anche la pena notare alcune delle funzionalità extra che JPA non specifica, che potrebbero rivelarsi utili in applicazioni più grandi:

  1. Personalizzabile CRUD bilancio con il @SQLInsert, @SQLUpate e @SQLDelete annotazioni
  2. Supporto per l'eliminazione graduale
  3. Entità immutabili con l' annotazione @Immutable

Per un'immersione più approfondita in Hibernate e nella persistenza di Java, vai alla nostra serie di tutorial sulla persistenza di Spring.

6. EclipseLink

EclipseLink, creato dalla Eclipse Foundation, fornisce un'implementazione JPA open source . Inoltre, EclipseLink supporta una serie di altri standard di persistenza come Java Architecture for XML Binding (JAXB) .

In poche parole, invece di rendere persistente un oggetto su una riga del database, JAXB lo mappa su una rappresentazione XML.

Successivamente, confrontando la stessa implementazione dell'annotazione @Entity , vediamo che EclipseLink offre di nuovo estensioni diverse. Sebbene non ci siano annotazioni per @ BatchSize come abbiamo visto prima, EclipseLink offre altre opzioni che Hibernate non ha.

Per esempio:

  1. @ReadOnly: specifica che l'entità da mantenere è di sola lettura
  2. @ Struct - definisce la classe da mappare a un tipo di 'struct' del database

Per saperne di più su ciò che EclipseLink ha da offrire, vai alla nostra guida su EclipseLink con Spring.

7. Conclusione

In questo articolo, abbiamo esaminato l'API Java Persistence o JPA.

Infine, abbiamo esplorato come differisce da Hibernate ed EclipseLink.