1.1 Associare le classi alle tabelle

Dopo aver appreso JDBC, molto probabilmente hai l'impressione che lavorare con un database da un'applicazione Java sia ancora un piacere. E se ti dicessi che tutto questo lavoro potrebbe essere svolto 10 volte più facilmente?

Qual è il vantaggio principale del linguaggio SQL? Questo è un linguaggio dichiarativo: descrive ciò che vogliamo ottenere e non dice nulla su come farlo. Come: questa è la preoccupazione del server SQL.

Lo stesso approccio può essere utilizzato quando si lavora con i database.

In un mondo ideale, potremmo semplicemente scrivere query SQL nel database e, in risposta, riceveremmo oggetti Java già pronti, o raccolte di oggetti Java, se ne richiedessimo diversi pezzi.

Cosa posso dire, questo è quello che hanno pensato diversi ragazzi nel 2000 e hanno deciso di scrivere il proprio framework ORM.

ORM è l'acronimo di Object-Relational Mapping ed è essenzialmente una mappatura di oggetti Java su query SQL.

I ragazzi hanno escogitato una cosa molto semplice: ogni tabella nel database deve corrispondere a una classe nell'applicazione Java . In un'applicazione Java, operiamo con oggetti e questi oggetti sanno già come salvarsi nel database.

C'erano tre approcci per risolvere questo problema, e assomigliavano a questo:

  1. L'oggetto si salva nel database e aggiorna i propri campi in base alle informazioni del database.
  2. L'oggetto è in grado di salvarsi nel database, ma non avvia mai questo caso.
  3. L'oggetto contiene solo dati e qualcuno lo salva nel database e lo carica dal database.

Inizialmente dominava il primo approccio, poi i server applicativi e gli Enterprise Java Bean erano popolari. C'era persino un'intera classe di bean chiamati Persistence EJB che potevano salvarsi da soli nel database.

Ma un giorno tutto è cambiato...

1.2 Nascita di Hibernate

Nel 2001 è stata rilasciata la prima versione del framework Hibernate. Era un framework molto semplice, ma permetteva l'uso di ordinari "oggetti stupidi" che non sapevano nulla su come avrebbero dovuto essere archiviati nel database o caricati da lì.

La mappatura dei campi delle classi e delle colonne Java in una tabella nel database è stata impostata utilizzando un file XML. E a volte erano piuttosto ingombranti. Ok, chi sto prendendo in giro? Erano pesanti tele di codice XML. E la situazione è stata salvata solo dal fatto che 20 anni fa non esistevano database così giganteschi come adesso.

Ma in realtà, la decisione più importante è stata quella di separare finalmente l'oggetto che deve essere salvato nel database dal codice che lo ha salvato lì . Questa soluzione non è davvero ovvia. Perché il principio dell'incapsulamento afferma che l'oggetto conosce meglio come deve essere salvato e caricato.

E l'approccio ORM rompe davvero quel concetto. La classe di dati espone la sua struttura interna, ma è diventato molto più semplice operare con gruppi di oggetti di tipi diversi.

Una svolta importante è arrivata dopo il rilascio di Java 5 , quando nel JDK sono apparse due cose:

  • Annotazioni
  • delega

AnnotazioniXML è stato rapidamente soppiantato e ora è stato facile specificare tutte le impostazioni necessarie per mappare una classe Java a una tabella nel database direttamente nella classe Java.

Deleganon così evidente per l'utente di Hibernate, ma il loro contributo è stato ancora più serio. Quando richiedi uno o più oggetti specifici da Hibernate, ti restituisce semplicemente uno stub (proxy) e intercetta tutte le chiamate ai suoi metodi.

Ciò ha permesso di implementare vari meccanismi di Lazy Loading e ha portato la velocità e l'efficienza di Hibernate a un livello completamente altissimo per quel tempo. Hibernate non è diventato solo uno standard industriale de facto, ma ha iniziato a essere tradotto in altre lingue. Quindi, ad esempio, Framework NHibernate è apparso per C#.

1.3 Nascita dell'APP

De facto seguito dal riconoscimento de jure. Gli sviluppatori JDK hanno deciso di creare una specifica su come mappare correttamente gli oggetti alle tabelle in un database. Questa specifica è chiamataAPP- API di persistenza Java.

Questa è esattamente la specifica. Descrive come tutto dovrebbe funzionare e di quali annotazioni abbiamo bisogno per contrassegnare diverse parti della classe se vogliamo che i suoi oggetti vengano salvati nel database.

Sembra che i ragazzi abbiano appena preso Hibernate come base e ne abbiano cambiato i nomi dei pacchetti. Perché tutte le annotazioni che erano in Hibernate sono state spostate in JPA quasi una per una.

Oggi, Hibernate implementa completamente l'intera specifica JPA, oltre ad alcune funzionalità aggiuntive che rendono ancora più confortevole il lavoro con esso. Pertanto, in termini di standardizzazione, possiamo dire che Hibernate ha due serie di funzionalità:

  • Norma dell'APP
  • Hibernate Native API (funzionalità aggiuntiva)

La documentazione ufficiale di Hibernate lo descrive in questo modo:

Ma sia in base alla mia esperienza che dopo aver riletto la documentazione di Hibernate, posso dire che JPA e Hibernate API sono uguali al 95%. Sono solo concetti identici.

1.4 Maven per l'ibernazione

Dato che ho elogiato così tanto Hibernate, penso che sia ora di passare a lavorarci un po' più duramente.

In primo luogo, c'è un sito ufficiale, dove c'è solo un mucchio di documentazione in lingua inglese. Lei, ovviamente, ha un pregiudizio nelle informazioni di riferimento e non nella formazione. Ma è comunque meglio che eseguire il debug dei sorgenti, giusto? :)

Istruzione:

  1. Si apre il collegamento .
  2. La guardi a lungo.
  3. Tornando a CodeGym.
  4. Leggi le mie ulteriori lezioni.

Il mio compito è semplificare cose complesse e spiegarle in termini semplici. E se hai raggiunto questo livello, allora posso farlo.

Bene, per iniziare con Hibernate, devi aggiungerlo al tuo pom.xml. Ad oggi è già disponibile la sesta versione di Hibernate, ovvero la 6.1.1, quindi impareremo a lavorare con l'ultima versione.

Basta aggiungere queste righe al tuo pom.xml:

<dependency>
	<groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
	<version>6.1.1.Final</version>
</dependency>

Se stai leggendo questa conferenza fuori dalla finestra del 2023+, la nuova versione può essere scaricata qui .

Importante! Alcune delle librerie utilizzate da Hibernate sono state deprecate in JDK 11 e JDK 17, quindi se hai problemi a far funzionare il tuo progetto, aggiungi queste dipendenze:

<dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.29.0-GA</version>
</dependency>