1.1 Kartläggning av klasser till tabeller

Efter att ha lärt dig JDBC har du troligen intrycket att det fortfarande är ett nöje att arbeta med en databas från en Java-applikation. Tänk om jag sa till dig att allt detta arbete kunde göras 10 gånger lättare?

Vilken är den största fördelen med SQL-språket? Detta är ett deklarativt språk - det beskriver vad vi vill få, och säger ingenting alls om hur man gör det. Hur - detta är SQL-serverns oro.

Samma tillvägagångssätt kan användas när man arbetar med databaser.

I en idealisk värld kunde vi helt enkelt skriva SQL-frågor till databasen, och som svar skulle vi få färdiga Java-objekt, eller samlingar av Java-objekt, om vi begärde flera stycken.

Vad kan jag säga, detta är vad flera killar tyckte år 2000 och bestämde sig för att skriva sitt eget ORM-ramverk.

ORM står för Object-Relational Mapping och är i huvudsak en mappning av Java-objekt till SQL-frågor.

Killarna kom på en väldigt enkel sak - varje tabell i databasen måste motsvara någon klass i Java-applikationen . I en Java-applikation arbetar vi med objekt, och dessa objekt vet redan hur de ska spara sig själva i databasen.

Det fanns tre sätt att lösa detta problem, och de såg ut ungefär så här:

  1. Objektet sparar sig till databasen och uppdaterar sina fält baserat på information från databasen.
  2. Objektet kan spara sig själv i databasen, men initierar aldrig detta fall.
  3. Objektet innehåller endast data, och någon sparar det i databasen och laddar det från databasen.

Till en början dominerade det första tillvägagångssättet, sedan var applikationsservrar och Enterprise Java Beans populära. Det fanns till och med en hel klass av bönor som heter Persistence EJBs som kunde spara sig själva i databasen.

Men en dag förändrades allt...

1.2 Uppkomsten av Hibernate

2001 släpptes den första versionen av Hibernate-ramverket. Det var ett väldigt enkelt ramverk, men det tillät användning av vanliga "dum objekt" som inte visste något om hur de skulle lagras i databasen eller laddas därifrån.

Kartläggning av fält av Java-klasser och kolumner i en tabell i databasen sattes med en XML-fil. Och ibland var de ganska skrymmande. Okej, vem skojar jag. De var rejäla dukar av XML-kod. Och situationen räddades bara av att det för 20 år sedan inte fanns några så gigantiska databaser som nu.

Men i själva verket var det mest kraftfulla beslutet att äntligen separera objektet som måste sparas i databasen från koden som sparade det där . Denna lösning är inte riktigt självklar. För principen om inkapsling säger att föremålet vet bäst om hur det behöver förvaras och laddas.

Och ORM-metoden bryter verkligen det konceptet. Dataklassen exponerar sin interna struktur, men det har blivit mycket lättare att arbeta med grupper av objekt av olika typer.

Ett stort genombrott kom efter lanseringen av Java 5 , när två saker dök upp i JDK:

  • Anteckningar
  • ombud

AnteckningarXML ersattes snabbt och nu var det enkelt att ange alla nödvändiga inställningar för att mappa en Java-klass till en tabell i databasen direkt i Java-klassen.

Ombudinte så märkbar för Hibernate-användaren, men deras bidrag var ännu mer seriöst. När du begär ett specifikt objekt eller objekt från Hibernate, returnerar det helt enkelt en stubb (proxy), och avlyssnar alla anrop till dess metoder.

Detta gjorde det möjligt att implementera olika Lazy Loading-mekanismer och höjde hastigheten och effektiviteten i Hibernate till en helt skyhög nivå för den tiden. Hibernate har inte bara blivit en de facto industristandard - den har börjat översättas till andra språk. Så till exempel, Framework NHibernate dök upp för C#.

1.3 Framväxten av den gemensamma parlamentariska församlingen

De facto följt av de jure erkännande. JDK-utvecklarna bestämde sig för att skapa en specifikation för hur man korrekt mappar objekt till tabeller i en databas. Denna specifikation kallasJPA- Java Persistence API.

Detta är exakt specifikationen. Den beskriver hur allt ska fungera och vilka anteckningar vi behöver för att markera olika delar av klassen om vi vill att dess objekt ska sparas i databasen.

Det verkar som att killarna bara tog Hibernate som grund och ändrade paketnamnen från det. Eftersom alla anteckningar som fanns i Hibernate flyttade till JPA nästan en efter en.

Idag implementerar Hibernate fullständigt hela JPA-specifikationen, samt några ytterligare funktioner som gör arbetet med det ännu bekvämare. Därför, när det gäller standardisering, kan vi säga att Hibernate har två uppsättningar funktioner:

  • JPA-standard
  • Hibernate Native API (ytterligare funktionalitet)

Den officiella Hibernate-dokumentationen beskriver det så här:

Men både baserat på min erfarenhet och efter att ha läst om Hibernate-dokumentationen kan jag säga att JPA och Hibernate API är 95% lika. De är bara identiska begrepp.

1.4 Maven för Hibernate

Eftersom jag har hyllat Hibernate så mycket tycker jag att det är dags att gå vidare och jobba lite hårdare med det.

För det första finns det en officiell sida, där det bara finns en massa engelskspråkig dokumentation. Hon har naturligtvis en partiskhet i referensinformation, och inte i träning. Men det är ändå bättre än att felsöka källorna, eller hur? :)

Instruktion:

  1. Du öppnar länken .
  2. Du tittar på henne länge.
  3. Kommer tillbaka till CodeGym.
  4. Du läser mina vidare föreläsningar.

Mitt jobb är att förenkla komplexa saker och förklara dem i enkla termer. Och om du har nått den här nivån, då kan jag göra det.

Tja, för att komma igång med Hibernate måste du lägga till det i din pom.xml. Hittills är den 6:e versionen av Hibernate redan tillgänglig, eller snarare 6.1.1, så vi kommer att lära oss hur man arbetar med den senaste versionen.

Lägg bara till dessa rader i din pom.xml:


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

Om du läser den här föreläsningen utanför fönstret för 2023+, så kan den nya versionen laddas ner här .

Viktig! Några av biblioteken som Hibernate använder har föråldrats i JDK 11 och JDK 17, så om du har problem med att få igång ditt projekt, lägg till dessa beroenden till 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>