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>