Forskellen mellem JPA, Hibernate og EclipseLink

1. Introduktion

I denne vejledning diskuterer vi Hibernate og Java Persistence API (JPA) - med fokus på forskellene mellem dem.

Godt start med at udforske, hvad JPA er, hvordan det bruges, og kernebegreberne bag det.

Derefter ser vi på, hvordan Hibernate og EclipseLink passer ind i billedet.

2. Objektrelationel kortlægning

Før vi dykker ned i JPA, er det vigtigt at forstå begrebet Object-Relational Mapping - også kendt som ORM.

Objektrelationel kortlægning er simpelthen processen med at fastholde ethvert Java-objekt direkte til en databasetabel. Normalt bliver navnet på det objekt, der vedvares, navnet på tabellen, og hvert felt inden for objektet bliver en kolonne. Når tabellen er opsat, svarer hver række til en post i applikationen.

3. En introduktion til JPA

Java Persistence API, eller JPA, er en specifikation, der definerer styring af relationsdata i en Java-applikation. API'et kortlægger et sæt koncepter, der definerer, hvilke objekter inden for applikationen der skal vedholdes, og hvordan det skal fortsætte dem.

Det er vigtigt at bemærke her, at JPA er kun en specifikation, og at den har brug for en implementering for at arbejde - men mere om det senere.

Lad os nu diskutere nogle af de centrale JPA-koncepter, som en implementering skal dække.

3.1. Enhed

Det javax.persistence.Entity klasse definerer, hvilke objekter der skal fastholdes i databasen. For hver vedvarende enhed opretter JPA en ny tabel i den valgte database.

Derudover skal alle valgte enheder definere en primær nøgle betegnet med @Id kommentar. Sammen med @GeneratedValue annotation, definerer vi, at den primære nøgle skal genereres automatisk, når posten fortsættes til databasen.

Lad os se på et hurtigt eksempel på en enhed beskrevet af JPA.

@Entity offentlig klasse bil {@GeneratedValue @Id offentlig lang id; // getters og setters} 

Husk, dette har i øjeblikket ingen effekt på applikationen - JPA indeholder ikke nogen implementeringskode.

3.2. Markpersistens

Et andet kernekoncept for JPA er felt persistens. Når et objekt i Java er defineret som en enhed, forbliver alle felter i det automatisk som forskellige kolonner i enhedstabellen.

Hvis der er et felt i et vedvarende objekt, som vi gør det ikke ønsker at fortsætte til databasen, kan vi erklære feltet forbigående med @Transient kommentar.

3.3. Relationer

Næste, JPA specificerer, hvordan vi skal håndtere relationer mellem forskellige databasetabeller inden for vores ansøgning. Som vi har set, håndterer JPA dette med kommentarer. Der er fire forholdsbemærkninger, som vi skal huske på:

  1. @En til en
  2. @OneToMany
  3. @ManyToOne
  4. @ManyToMany

Lad os se på, hvordan dette fungerer:

@Entity offentlig klasse SteeringWheel {@OneToOne privat bilbil // getters og setters}

I vores eksempel ovenfor er Styrehjul klasse beskriver et forhold til vores forhold til vores Bil klasse fra tidligere.

3.4. Enhedschef

Endelig blev javax.persistence.EntityManager klasse specificerer operationer til og fra databasen. Det EntityManager indeholder almindelige Opret, læse, opdatere og slette (CRUD) operationer der er vedvarende i databasen.

4. JPA-implementeringer

Med JPA-specifikation definerer vi, hvordan og hvad vi skal fortsætte, vi nu skal vælge en implementeringsudbyder for at levere den nødvendige kode. Uden en sådan udbyder skal vi implementere alle relevante klasser for at overholde JPA, og det er en masse af arbejde!

Der er masser af udbydere at vælge imellem, hvor hver viser sine egne fordele og ulemper. Når man træffer en beslutning som vi skal bruge, skal vi overvej et par af følgende punkter:

  1. Projektets modenhed - hvor længe har udbyderen eksisteret, og hvor veldokumenteret er det?
  2. Underprojekter - har udbyderen nogen nyttige delprojekter til vores nye ansøgning?
  3. Fællesskabsstøtte - er der nogen til at hjælpe os, når vi ender med en kritisk fejl?
  4. Benchmarking - hvor performant er implementeringen?

Selvom vi ikke går i dybden med benchmarking af forskellige JPA-udbydere, indeholder JPA Performance Benchmark (JPAB) værdifuld indsigt i dette.

Med det ude af vejen, lad os tage et kort kig på nogle af de største udbydere af JPA.

5. Dvale

Kernen i Dvaletilstand er et objektrelationelt kortlægningsværktøj, der giver en implementering af JPA. Dvaletilstand er en af ​​de mest modne JPA-implementeringer rundt med et stort samfund, der bakker op om projektet.

Det implementerer alle de javax.persistenceklasser, vi kiggede på tidligere i artiklen samt leverer funktionalitet ud over JPA - dvale-værktøjer, validering og søgning. Selvom disse dvale-specifikke API'er kan være nyttige, er de ikke nødvendige i applikationer, der kun kræver den grundlæggende JPA-funktionalitet.

Lad os tage et hurtigt kig på, hvad dvale tilbyder med @Enhed kommentar.

Mens JPA-kontrakten opfyldes, @ org.hibernate.annotations.Entity tilføjer yderligere metadata, der går ud over JPA-specifikationen. Dette gør det muligt at finjustere enhedens vedholdenhed. Lad os for eksempel se på et par kommentarer, der tilbydes af Hibernate, der udvider funktionaliteten af @Enhed:

  1. @Bord tillader os at angiv navnet på tabellen oprettet til enheden
  2. @BatchSizeangiver batchstørrelse ved hentning af rets fra bordet

Det er også værd at bemærke et par af de ekstra funktioner, som JPA ikke specificerer, som kan vise sig nyttige i større applikationer:

  1. Kan tilpasses CRUD udsagn med @SQLInsert, @SQLUpate og @SQLDelete kommentarer
  2. Støtte til blød sletning
  3. Uforanderlige enheder med @Immutable kommentar

For et dybere dykke ned i dvale- og Java-vedholdenhed - gå over til vores Spring-persistens-tutorial-serie.

6. EclipseLink

EclipseLink, bygget af Eclipse Foundation, giver en open source-JPA-implementering. Derudover EclipseLink understøtter en række andre persistensstandarder såsom Java Architecture for XML Binding (JAXB).

Kort sagt, i stedet for at fastholde et objekt til en databaserække, kortlægger JAXB det til en XML-repræsentation.

Dernæst ved at sammenligne det samme @Enhed annoteringsimplementering, ser vi, at EclipseLink igen tilbyder forskellige udvidelser. Mens der ikke er nogen kommentar til @BatchSize som vi så tidligere, EclipseLink tilbyder andre muligheder, som dvale ikke gør.

For eksempel:

  1. @ReadOnly - angiver, at den enhed, der skal vedholdes, er skrivebeskyttet
  2. @Struktur - definerer klassen, der skal kortlægges, til en database 'struct' type

For at læse mere om, hvad EclipseLink har at tilbyde, gå over til vores guide om EclipseLink med Spring.

7. Konklusion

I denne artikel har vi kiggede på Java Persistence API eller JPA.

Endelig udforskede vi hvordan det adskiller sig fra dvale og EclipseLink.