Razlika između JPA, Hibernate i EclipseLink

1. Uvod

U ovom uputstvu razgovarat ćemo o hibernaciji i Java Persistent API-ju (JPA) - s naglaskom na razlike među njima.

Dobro započnite s istraživanjem što je JPA, kako se koristi i temeljni koncepti iza toga.

Zatim ćemo pogledati kako se Hibernate i EclipseLink uklapaju u sliku.

2. Objektno-relacijsko mapiranje

Prije nego što uđemo u JPA, važno je razumjeti koncept objektno-relacijskog mapiranja - poznat i kao ORM.

Objektno-relacijsko mapiranje je jednostavno postupak ustrajavanja bilo kojeg Java objekta izravno u tablici baze podataka. Obično naziv objekta koji se održava postaje naziv tablice, a svako polje unutar tog objekta postaje stupac. S postavljenom tablicom, svaki redak odgovara zapisu u aplikaciji.

3. Uvod u JPA

API za trajnost Java, ili JPA, specifikacija je koja definira upravljanje relacijskim podacima u Java aplikaciji. API mapira skup koncepata koji definira koje objekte u aplikaciji treba održavati i kako ih treba održavati.

Ovdje je važno napomenuti da JPA je samo specifikacija i za rad mu je potrebna implementacija - ali o tome kasnije.

Sada, razgovarajmo o nekim ključnim JPA konceptima koje provedba mora pokriti.

3.1. Entitet

The javax.postojanost.Entitet klasa definira koje objekte treba zadržati u bazi podataka. Za svaki trajni entitet JPA stvara novu tablicu unutar odabrane baze podataka.

Uz to, svi odabrani entiteti trebali bi definirati primarni ključ označen s @Iskaznica bilješka. Zajedno s @GeneratedValue napomena, definiramo da primarni ključ treba automatski generirati kada se zapis nastavi u bazu podataka.

Pogledajmo kratki primjer entiteta koji je opisao JPA.

@ Entity javni razred automobila {@GeneratedValue @Id public long id; // geteri i postavljači} 

Zapamtite, ovo trenutno neće imati učinka na aplikaciju - JPA ne pruža nikakav implementacijski kod.

3.2. Upornost na terenu

Sljedeći temeljni koncept JPA je postojanost na terenu. Kada se objekt u Javi definira kao entitet, sva se polja unutar njega automatski nastavljaju kao različiti stupci unutar tablice entiteta.

Ako unutar postojanog objekta postoji polje koje mi nemoj ako želimo ustrajati na bazi podataka, polje možemo proglasiti prolaznim s @Prijelazno bilješka.

3.3. Odnosi

Sljedeći, JPA navodi kako bismo trebali upravljati odnosima između različitih tablica baze podataka unutar naše prijave. Kao što smo vidjeli, JPA to rješava s napomenama. Postoje četiri napomene o vezama koje moramo imati na umu:

  1. @Jedan na jedan
  2. @OneToMany
  3. @ManyToOne
  4. @ManyToMany

Pogledajmo kako ovo funkcionira:

@Entity javni razred SteeringWheel {@OneToOne private car // getters and setters}

U našem gornjem primjeru, Upravljač razred opisuje odnos jedan prema jedan s našim Automobil razred od ranije.

3.4. Upravitelj entiteta

Napokon, javax.persistence.EntityManager klasa specificira operacije prema i iz baze podataka. The EntityManager sadrži uobičajene radnje Izrada, čitanje, ažuriranje i brisanje (CRUD) koji se zadržavaju u bazi podataka.

4. Provedbe JPA

Sa specifikacijom JPA koja definira kako i na čemu trebamo ustrajati, sada smo trebate odabrati dobavljača implementacije za isporuku potrebnog koda. Bez takvog davatelja usluge trebali bismo implementirati sve relevantne klase kako bismo bili u skladu s JPA, a to je a mnogo od posla!

Postoji mnogo pružatelja usluga između kojih svaki ima svoje prednosti i nedostatke. Prilikom donošenja odluke na kojem bismo trebali koristiti razmotrite nekoliko sljedećih točaka:

  1. Zrelost projekta - koliko dugo pružatelj usluga postoji, i koliko je to dobro dokumentirano?
  2. Potprojekti - ima li pružatelj korisnih potprojekata za našu novu aplikaciju?
  3. Podrška zajednice - je tamo bilo tko da nam pomogne kad završimo s kritičnom greškom?
  4. Benchmarking - kako izveden je li provedba?

Iako nećemo detaljno analizirati benčmarking različitih dobavljača JPA, JPA Performance Benchmark (JPAB) sadrži dragocjen uvid u to.

Ako to maknemo s puta, pogledajmo ukratko neke od najboljih pružatelja usluga JPA.

5. Hibernacija

U svojoj srži, Hibernate je objektno-relacijski alat za mapiranje koji pruža implementaciju JPA. Hibernate je jedna od najzrelijih implementacija JPA-e okolo, s ogromnom zajednicom koja podupire projekt.

Provodi sve javax.postojanostklase koje smo gledali ranije u članku, kao i pružanje funkcionalnosti izvan JPA - Hibernate alata, provjere valjanosti i pretraživanja. Iako ovi API-ji specifični za hibernaciju mogu biti korisni, oni nisu potrebni u aplikacijama koje zahtijevaju samo osnovnu JPA funkcionalnost.

Kratko ćemo pogledati što Hibernate nudi s @ Entitet bilješka.

Dok ispunjava ugovor o JPA, @ org.hibernate.annotations.Entity dodaje dodatne metapodatke koji nadilaze JPA specifikaciju. To omogućuje fino podešavanje postojanosti entiteta. Na primjer, pogledajmo nekoliko napomena koje nudi Hibernate koje proširuju funkcionalnost @ Entitet:

  1. @Stol omogućuje nam da navedite naziv tablice stvorena za entitet
  2. @BatchSizeodređuje veličina serije prilikom dohvaćanja entitetas stola

Također je vrijedno istaknuti nekoliko dodatnih značajki koje JPA ne navodi, a koje bi se mogle pokazati korisnima u većim aplikacijama:

  1. Prilagodljive CRUD izjave s @SQLInsert, @SQLUpate i @SQLDelete bilješke
  2. Podrška za meko brisanje
  3. Nepromjenjivi entiteti s @ Nepromjenjivo bilješka

Za dublje ronjenje u hibernaciji i postojanosti Java - prijeđite na našu seriju tutorijala za trajno proljeće.

6. EclipseLink

EclipseLink, sagradila Zaklada Eclipse, pruža provedbu JPA otvorenog koda. Uz to, EclipseLink podržava niz drugih standarda postojanosti kao što je Java Architecture for XML Binding (JAXB).

Jednostavno rečeno, umjesto da objekt ustraje u retku baze podataka, JAXB ga preslikava u XML prikaz.

Dalje, usporedbom istog @ Entitet primjene napomena, vidimo da EclipseLink nudi ponovno različita proširenja. Iako ne postoji napomena za @BatchSize kao što smo vidjeli ranije, EclipseLink nudi druge opcije koje Hibernate ne nudi.

Na primjer:

  1. @ReadOnly - navodi da je entitet koji će se održavati samo za čitanje
  2. @Struktura - definira klasu koja se preslikava na tip 'struct' baze podataka

Da biste pročitali više o tome što EclipseLink nudi, prijeđite na naš vodič o EclipseLinku s proljećem.

7. Zaključak

U ovom smo članku pogledao Java Persistent API ili JPA.

Napokon smo istražili po čemu se razlikuje od Hibernatea i EclipseLinka.