Különbség a JPA, a Hibernate és az EclipseLink között

1. Bemutatkozás

Ebben az oktatóanyagban a Hibernate-t és a Java Persistence API-t (JPA) vitatjuk meg - különös tekintettel a köztük lévő különbségekre.

Jól kezdje annak feltárásával, hogy mi a JPA, hogyan használják, és az alapvető fogalmakat mögötte.

Ezután megvizsgáljuk, hogy a Hibernate és az EclipseLink hogyan illeszkedik a képbe.

2. Objektum-relációs leképezés

Mielőtt belevágnánk a JPA-ba, fontos megértenünk az Object-Relational Mapping - más néven ORM - fogalmát.

Az objektum-relációs leképezés egyszerűen bármely Java objektum közvetlen adatbázis-táblába történő megőrzésének folyamata. Általában a megtartott objektum neve a tábla nevévé válik, és az objektumon belül minden mező oszlopká válik. A felállított tábla minden sora megegyezik az alkalmazás rekordjával.

3. Bevezetés a JPA-ba

A Java Persistence API vagy JPA olyan specifikáció, amely meghatározza a relációs adatok kezelését egy Java alkalmazásban. Az API feltérképezi egy fogalomkészletet, amely meghatározza, hogy az alkalmazáson belül mely objektumokat kell megtartani, és hogyan kell kitartaniuk.

Fontos megjegyezni itt A JPA csak specifikáció, és a működéséhez végrehajtásra van szükség - de erről később.

Most térjünk át néhány közös parlamenti képviselő-testület koncepciójára, amelyekre a megvalósításnak ki kell terjednie.

3.1. Entitás

A javax.persistence.Entity osztály meghatározza, hogy mely objektumokat kell megőrizni az adatbázisban. Minden fennmaradó entitáshoz a JPA új táblát hoz létre a kiválasztott adatbázisban.

Ezenkívül az összes kiválasztott entitásnak meg kell határoznia egy elsődleges kulcsot, amelyet a @Id annotáció. A @GeneratedValue annotációval meghatározzuk, hogy az elsődleges kulcsot automatikusan létre kell hozni, amikor a rekord megmarad az adatbázisban.

Nézzünk meg egy gyors példát a JPA által leírt entitásra.

@Entity public class Car {@GeneratedValue @Id public long id; // szerelők és beállítók} 

Ne feledje, hogy ez jelenleg nincs hatással az alkalmazásra - a JPA nem ad meg végrehajtási kódot.

3.2. Terepi kitartás

A JPA másik alapfogalma a terepi kitartás. Amikor a Java objektumát entitásként definiálják, az abban található összes mező automatikusan megmarad külön oszlopként az entitás táblázatban.

Ha van egy mező egy állandó objektumon belül, akkor mi ne meg akarunk maradni az adatbázisban, a mezőt tranziensnek nyilváníthatjuk a @ Átmeneti annotáció.

3.3. Kapcsolatok

Következő, A JPA meghatározza, hogyan kell kezelnünk a kapcsolatokat a különböző adatbázis-táblák között alkalmazásunkon belül. Mint láttuk, a JPA ezt kommentárokkal kezeli. Négy kapcsolati jegyzetet kell szem előtt tartanunk:

  1. @1-1
  2. @Egy a sokhoz
  3. @ManyToOne
  4. @ManyToMany

Vessünk egy pillantást ennek működésére:

@Entity nyilvános osztályú SteeringWheel {@OneToOne privát autó // // szerelők és beállítók}

A fenti példánkban a Kormánykerék osztály egy az egyhez való viszonyt írja le a miénkkel Autó osztály korábbi.

3.4. Entitáskezelő

Végül a javax.persistence.EntityManager osztály meghatározza az adatbázisba és az adatbázisból történő műveleteket. A EntityManager CRUD (Create, Read, Update and Delete) műveleteket tartalmaz amelyek fennmaradnak az adatbázisban.

4. A KPK megvalósítása

A JPA specifikációja meghatározza, hogyan és miben kell továbbra is fennállnunk ki kell választania egy megvalósítási szolgáltatót a szükséges kód megadásához. Ilyen szolgáltató nélkül az összes vonatkozó osztályt meg kell valósítanunk a JPA-nak való megfelelés érdekében, és ez a sok munkában!

Rengeteg szolgáltató közül lehet választani, mindegyikük megmutatja saját előnyeit és hátrányait. Döntéskor melyre használhatnánk vegye figyelembe az alábbiak közül néhányat:

  1. A projekt érettsége - mióta van a szolgáltató, és mennyire jól dokumentált?
  2. Alprojektek - van-e a szolgáltatónak hasznos alprojektje az új alkalmazásunkhoz?
  3. Közösségi támogatás - van bárki, aki segíthet nekünk, amikor kritikus hibával küzdünk?
  4. Benchmarking - mennyire teljesítő a megvalósítás?

Noha nem fogunk elmélyülni a különböző JPA-szolgáltatók összehasonlításában, a JPA Performance Benchmark (JPAB) értékes betekintést nyújt ebbe.

Ezzel eltekintve nézzük meg röviden a JPA legfontosabb szolgáltatóit.

5. Hibernálás

Magjában, A hibernálás egy objektum-relációs leképező eszköz, amely biztosítja a JPA megvalósítását. A hibernálás az egyik legérettebb JPA megvalósítás egy hatalmas közösség támogatta a projektet.

Megvalósítja az összes javax.kitartásosztályok, amelyeket korábban a cikkben megvizsgáltunk, valamint a JPA-n kívüli funkcionalitás biztosítása - Hibernate eszközök, validálás és keresés. Bár ezek a hibernált állapotra jellemző API-k hasznosak lehetnek, nincs szükség rájuk olyan alkalmazásokban, amelyek csak az alap JPA funkciót igénylik.

Vessünk egy gyors pillantást arra, mit kínál a Hibernate a @Entity annotáció.

A JPA-szerződés teljesítése közben @ org.hibernate.annotations.Entity további metaadatokat ad hozzá, amelyek meghaladják a JPA specifikációit. Ez lehetővé teszi az entitások kitartásának finomhangolását. Vizsgáljuk meg például a Hibernate által kínált néhány kommentárt, amelyek kibővítik a @Entity:

  1. @Asztal lehetővé teszi számunkra adja meg a táblázat nevét az entitás számára létrehozott
  2. @Csomó méretmeghatározza a kötegméret a jogosultság lekérésekors az asztaltól

Érdemes megjegyezni néhány olyan kiegészítő funkciót, amelyet a JPA nem határoz meg, és amelyek hasznosak lehetnek nagyobb alkalmazásoknál:

  1. Testreszabható CRUD utasítások a @SQLInsert, @SQLUpate és @SQLDelete annotációk
  2. A puha törlés támogatása
  3. Változhatatlan entitások a @Változhatatlan annotáció

Ha mélyebbre kíván merülni a hibernált és a Java-perzisztenciában, térjen át a tavaszi perzisztencia oktató sorozatunkra.

6. EclipseLink

Az Eclipse Alapítvány által épített EclipseLink nyílt forráskódú JPA megvalósítást biztosít. Ezenkívül az EclipseLink számos más perzisztencia-szabványt támogat, például a Java Architecture for XML Binding (JAXB).

Egyszerűen fogalmazva, ahelyett, hogy objektumot tartana fenn egy adatbázis sorban, a JAXB egy XML reprezentációra térképezi fel.

Ezután ugyanazok összehasonlításával @Entity megjegyzések megvalósításával azt látjuk, hogy az EclipseLink ismét különböző kiterjesztéseket kínál. Bár a @ -hoz nincs megjegyzésCsomó méret ahogy korábban láttuk, Az EclipseLink más lehetőségeket is kínál, amelyeket a Hibernate nem.

Például:

  1. @ReadOnly - megadja, hogy a fennmaradó entitás csak olvasható legyen
  2. @Szerkezet - meghatározza az osztályt, hogy leképezzék egy adatbázis „struct” típusára

Ha többet szeretne megtudni az EclipseLink kínálatáról, olvassa el az EclipseLink with Spring című útmutatónkat.

7. Következtetés

Ebben a cikkben megtettük megnézte a Java Persistence API-t vagy JPA-t.

Végül feltártuk miben különbözik a Hibernate és az EclipseLink programtól.