1.1 Kortlægning af klasser til tabeller

Efter at have lært JDBC, har du højst sandsynligt det indtryk, at det stadig er en fornøjelse at arbejde med en database fra en Java-applikation. Hvad hvis jeg fortalte dig, at alt dette arbejde kunne udføres 10 gange nemmere?

Hvad er den største fordel ved SQL-sproget? Dette er et deklarativt sprog - det beskriver, hvad vi ønsker at få, og siger slet ikke noget om, hvordan man gør det. Hvordan - det er SQL-serverens bekymring.

Samme tilgang kan bruges, når man arbejder med databaser.

I en ideel verden kunne vi simpelthen skrive SQL-forespørgsler til databasen, og som svar ville vi modtage færdige Java-objekter eller samlinger af Java-objekter, hvis vi anmodede om flere stykker.

Hvad kan jeg sige, det er, hvad flere fyre tænkte i 2000 og besluttede at skrive deres egen ORM-ramme.

ORM står for Object-Relational Mapping og er i det væsentlige en mapping af Java-objekter til SQL-forespørgsler.

Fyrene kom op med en meget simpel ting - hver tabel i databasen skal svare til en eller anden klasse i Java-applikationen . I en Java-applikation opererer vi med objekter, og disse objekter ved allerede, hvordan de gemmer sig selv i databasen.

Der var tre tilgange til at løse dette problem, og de så nogenlunde sådan ud:

  1. Objektet gemmer sig selv i databasen og opdaterer sine felter baseret på information fra databasen.
  2. Objektet er i stand til at gemme sig selv til databasen, men starter aldrig denne sag.
  3. Objektet indeholder kun data, og nogen gemmer det i databasen og indlæser det fra databasen.

I starten dominerede den første tilgang, derefter var applikationsservere og Enterprise Java Beans populære. Der var endda en hel klasse af bønner kaldet Persistence EJB'er, der selv kunne redde sig selv ind i databasen.

Men en dag ændrede alt sig...

1.2 Fremkomst af Hibernate

I 2001 blev den første version af Hibernate-rammeværket udgivet. Det var et meget simpelt framework, men det tillod brugen af ​​almindelige "dumme objekter", der ikke vidste noget om, hvordan de skulle gemmes i databasen eller indlæses derfra.

Kortlægning af felter af Java-klasser og -kolonner i en tabel i databasen blev sat ved hjælp af en XML-fil. Og nogle gange var de ret omfangsrige. Okay, hvem laver jeg sjov. De var heftige lærreder af XML-kode. Og situationen blev kun reddet af, at der for 20 år siden ikke fandtes så gigantiske databaser som nu.

Men faktisk var den mest kraftfulde beslutning endelig at adskille objektet, der skal gemmes i databasen, fra koden, der gemte det der . Denne løsning er ikke rigtig indlysende. Fordi princippet om indkapsling siger, at objektet ved bedst om, hvordan det skal opbevares og læsses.

Og ORM-tilgangen bryder virkelig det koncept. Dataklassen afslører sin interne struktur, men det er blevet meget nemmere at arbejde med grupper af objekter af forskellige typer.

Et stort gennembrud kom efter udgivelsen af ​​Java 5 , da to ting dukkede op i JDK:

  • Anmærkninger
  • proxy

AnmærkningerXML blev hurtigt fortrængt, og nu var det nemt at angive alle de nødvendige indstillinger for at tilknytte en Java-klasse til en tabel i databasen lige i Java-klassen.

Fuldmagtikke så mærkbar for Hibernate-brugeren, men deres bidrag var endnu mere seriøst. Når du anmoder om et bestemt objekt eller objekter fra Hibernate, returnerer det blot en stub (proxy), og opsnapper alle opkald til dets metoder.

Dette gjorde det muligt at implementere forskellige Lazy Loading-mekanismer og hævede hastigheden og effektiviteten af ​​Hibernate til et helt skyhøjt niveau for den tid. Hibernate er ikke bare blevet en de facto industristandard - det er begyndt at blive oversat til andre sprog. Så for eksempel dukkede Framework NHibernate op for C#.

1.3 Fremkomsten af ​​Den Blandede Parlamentariske Forsamling

De facto efterfulgt af de jure anerkendelse. JDK-udviklerne besluttede at lave en specifikation for, hvordan man korrekt kortlægger objekter til tabeller i en database. Denne specifikation kaldesJPA- Java Persistence API.

Dette er præcis specifikationen. Den beskriver, hvordan alt skal fungere, og hvilke annoteringer vi skal bruge for at markere forskellige dele af klassen, hvis vi ønsker at dens objekter skal gemmes i databasen.

Det ser ud til, at fyrene lige tog Hibernate som grundlag og ændrede pakkenavnene fra det. Fordi alle annoteringerne, der var i Hibernate, flyttede til JPA næsten én efter én.

I dag implementerer Hibernate hele JPA-specifikationen, samt nogle ekstra funktioner, der gør arbejdet med det endnu mere behageligt. Derfor kan vi med hensyn til standardisering sige, at Hibernate har to sæt funktioner:

  • JPA standard
  • Hibernate Native API (ekstra funktionalitet)

Den officielle Hibernate-dokumentation beskriver det sådan:

Men både baseret på min erfaring og efter at have genlæst Hibernate-dokumentationen, kan jeg sige, at JPA og Hibernate API er 95% det samme. De er bare identiske begreber.

1.4 Maven for Hibernate

Da jeg har rost Hibernate så meget, synes jeg, det er på tide at gå videre til at arbejde lidt hårdere med det.

For det første er der en officiel side, hvor der bare er en masse engelsksproget dokumentation. Hun har selvfølgelig en bias i referenceoplysninger og ikke i træning. Men det er stadig bedre end at fejlsøge kilderne, ikke? :)

Instruktion:

  1. Du åbner linket .
  2. Du ser på hende i lang tid.
  3. Kommer tilbage til CodeGym.
  4. Du læser mine videre foredrag.

Min opgave er at forenkle komplekse ting og forklare dem i enkle vendinger. Og hvis du har nået dette niveau, så kan jeg gøre det.

Nå, for at komme i gang med Hibernate, skal du tilføje det til din pom.xml. Til dato er den 6. version af Hibernate allerede tilgængelig, eller rettere sagt 6.1.1, så vi lærer, hvordan man arbejder med den nyeste version.

Bare tilføj disse linjer til din pom.xml:

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

Hvis du læser dette foredrag uden for vinduet i 2023+, så kan den nye version downloades her .

Vigtig! Nogle af de biblioteker, som Hibernate bruger, er blevet forældet i JDK 11 og JDK 17, så hvis du har problemer med at få dit projekt op at køre, skal du tilføje disse afhængigheder 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>