1.1 Kartlegging av klasser til tabeller

Etter å ha lært JDBC, har du mest sannsynlig inntrykk av at det fortsatt er en fornøyelse å jobbe med en database fra en Java-applikasjon. Hva om jeg fortalte deg at alt dette arbeidet kunne gjøres 10 ganger enklere?

Hva er hovedfordelen med SQL-språket? Dette er et deklarativt språk – det beskriver hva vi ønsker å få, og sier ingenting om hvordan det skal gjøres. Hvordan - dette er bekymringen til SQL-serveren.

Den samme tilnærmingen kan brukes når du arbeider med databaser.

I en ideell verden kunne vi ganske enkelt skrive SQL-spørringer til databasen, og som svar ville vi motta ferdiglagde Java-objekter, eller samlinger av Java-objekter, hvis vi ba om flere stykker.

Hva kan jeg si, dette er hva flere gutter tenkte i 2000 og bestemte seg for å skrive sitt eget ORM-rammeverk.

ORM står for Object-Relational Mapping og er i hovedsak en kartlegging av Java-objekter til SQL-spørringer.

Gutta kom opp med en veldig enkel ting - hver tabell i databasen må tilsvare en klasse i Java-applikasjonen . I en Java-applikasjon opererer vi med objekter, og disse objektene vet allerede hvordan de skal lagre seg selv i databasen.

Det var tre tilnærminger til å løse dette problemet, og de så omtrent slik ut:

  1. Objektet lagrer seg selv i databasen og oppdaterer feltene sine basert på informasjon fra databasen.
  2. Objektet er i stand til å lagre seg selv i databasen, men starter aldri denne saken.
  3. Objektet inneholder kun data, og noen lagrer det i databasen og laster det fra databasen.

Opprinnelig dominerte den første tilnærmingen, deretter var applikasjonsservere og Enterprise Java Beans populære. Det var til og med en hel klasse bønner kalt Persistence EJBs som kunne lagre seg selv inn i databasen.

Men en dag forandret alt seg...

1.2 Fremveksten av dvalemodus

I 2001 ble den første versjonen av Hibernate-rammeverket utgitt. Det var et veldig enkelt rammeverk, men det tillot bruk av vanlige «dumme objekter» som ikke visste noe om hvordan de skulle lagres i databasen eller lastes derfra.

Kartlegging av felt av Java-klasser og -kolonner i en tabell i databasen ble satt ved hjelp av en XML-fil. Og noen ganger var de ganske store. Ok, hvem tuller jeg. De var heftige lerreter med XML-kode. Og situasjonen ble reddet bare av det faktum at det for 20 år siden ikke fantes så gigantiske databaser som nå.

Men faktisk var den kraftigste avgjørelsen å endelig skille objektet som må lagres i databasen fra koden som lagret det der . Denne løsningen er egentlig ikke åpenbar. Fordi innkapslingsprinsippet sier at objektet vet best om hvordan det skal lagres og lastes.

Og ORM-tilnærmingen bryter virkelig det konseptet. Dataklassen avslører sin interne struktur, men det har blitt mye enklere å operere med grupper av objekter av forskjellige typer.

Et stort gjennombrudd kom etter utgivelsen av Java 5 , da to ting dukket opp i JDK:

  • Merknader
  • proxy

MerknaderXML ble raskt erstattet, og nå var det enkelt å spesifisere alle nødvendige innstillinger for å kartlegge en Java-klasse til en tabell i databasen rett i Java-klassen.

Fullmaktikke så merkbar for Hibernate-brukeren, men deres bidrag var enda mer seriøst. Når du ber om et eller flere spesifikt objekter fra Hibernate, returnerer den ganske enkelt en stub (proxy), og avskjærer alle anrop til metodene.

Dette gjorde det mulig å implementere ulike Lazy Loading-mekanismer og hevet hastigheten og effektiviteten til Hibernate til et helt skyhøyt nivå for den tiden. Hibernate har ikke bare blitt en de facto industristandard – den har begynt å bli oversatt til andre språk. Så, for eksempel, dukket Framework NHibernate opp for C#.

1.3 Fremveksten av JPA

De facto etterfulgt av de jure anerkjennelse. JDK-utviklerne bestemte seg for å lage en spesifikasjon for hvordan man korrekt kartlegger objekter til tabeller i en database. Denne spesifikasjonen kallesJPA- Java Persistence API.

Dette er akkurat spesifikasjonen. Den beskriver hvordan alt skal fungere og hvilke merknader vi trenger for å merke ulike deler av klassen hvis vi vil at objektene skal lagres i databasen.

Det ser ut til at gutta bare tok Hibernate som grunnlag og endret pakkenavnene fra det. Fordi alle merknadene som var i Hibernate flyttet til JPA nesten én etter én.

I dag implementerer Hibernate hele JPA-spesifikasjonen, samt noen tilleggsfunksjoner som gjør arbeidet med det enda mer komfortabelt. Derfor, når det gjelder standardisering, kan vi si at Hibernate har to sett med funksjoner:

  • JPA standard
  • Hibernate Native API (ekstra funksjonalitet)

Den offisielle Hibernate-dokumentasjonen beskriver det slik:

Men både basert på min erfaring og etter å ha lest Hibernate-dokumentasjonen på nytt, kan jeg si at JPA og Hibernate API er 95% det samme. De er bare identiske konsepter.

1.4 Maven for Hibernate

Siden jeg har rost Hibernate så mye, synes jeg det er på tide å gå videre til å jobbe litt hardere med det.

For det første er det et offisielt nettsted, hvor det bare er en haug med engelskspråklig dokumentasjon. Hun har selvfølgelig en skjevhet i referanseinformasjon, og ikke i trening. Men det er fortsatt bedre enn å feilsøke kildene, ikke sant? :)

Instruksjon:

  1. Du åpner lenken .
  2. Du ser lenge på henne.
  3. Kommer tilbake til CodeGym.
  4. Du leser mine videre forelesninger.

Min jobb er å forenkle komplekse ting og forklare dem på en enkel måte. Og hvis du har nådd dette nivået, så kan jeg gjøre det.

Vel, for å komme i gang med Hibernate, må du legge den til i pom.xml. Til dags dato er den 6. versjonen av Hibernate allerede tilgjengelig, eller rettere sagt 6.1.1, så vi vil lære hvordan vi jobber med den nyeste versjonen.

Bare legg til disse linjene i pom.xml:


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

Hvis du leser dette foredraget utenfor vinduet til 2023+, så kan den nye versjonen lastes ned her .

Viktig! Noen av bibliotekene som Hibernate bruker har blitt avviklet i JDK 11 og JDK 17, så hvis du har problemer med å få prosjektet i gang, legg til disse avhengighetene til det:


  	<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>