Bevezetés

Ebben a bemutatóban a Hibernate-et és a Java Persistence API-t (JPA) tárgyaljuk – a kettő közötti különbségekre összpontosítva.

Azzal kezdjük, hogy megvizsgáljuk, mi is a JPA, hogyan használják, és milyen alapfogalmak állnak mögötte.

Aztán megnézzük, hogyan illeszkedik a képbe a Hibernate és az EclipseLink.

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

Mielőtt belemerülnénk a JPA-ba, fontos megérteni az objektum-relációs leképezés – más néven ORM – fogalmát.

Az objektum-relációs leképezés egyszerűen azt a folyamatot jelenti, amikor bármely Java objektumot közvetlenül egy adatbázis táblába helyezünk át. Általában a perzisztált objektum neve lesz a táblázat neve, és az objektumon belüli minden mező egy-egy oszlop lesz. A táblázat beállításával minden sor megfelel egy rekordnak az alkalmazásban.

Egy bevezetés a JPA-ba

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

Nagyon fontos itt megjegyezni, hogy a JPA csak egy specifikáció, és hogy a működéséhez implementációra van szükség – de erről később.

Most beszéljünk néhány alapvető JPA-fogalomról, amelyeket egy implementációnak le kell fednie.

3.1. A JPA és a Java adatmegőrzési rendszer közötti kapcsolat. Entity

A javax.persistence.Entity osztály határozza meg, hogy mely objektumokat kell az adatbázisba perzisztálni. A JPA minden egyes perzisztált entitáshoz létrehoz egy új táblát a kiválasztott adatbázisban.

Ezeken kívül minden kiválasztott entitásnak meg kell határoznia egy elsődleges kulcsot, amelyet a @Id annotáció jelöl. A @GeneratedValue annotációval együtt definiáljuk, hogy az elsődleges kulcs automatikusan generálódjon, amikor a rekordot az adatbázisba perzisztáljuk.

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

@Entitypublic class Car { @GeneratedValue @Id public long id; // getters and setters}

Ne feledjük, hogy ennek jelenleg nincs hatása az alkalmazásra – a JPA nem biztosít semmilyen implementációs kódot.

3.2. A JPA által leírt entitások a JPA által leírt entitásokhoz tartoznak. Mezőperzisztencia

A JPA másik alapvető koncepciója a mezőperzisztencia. Amikor egy objektumot Javában entitásként definiálunk, a benne lévő összes mező automatikusan az entitás táblán belül különböző oszlopokként perzisztálódik.

Ha egy perzisztált objektumon belül van olyan mező, amelyet nem akarunk perzisztálni az adatbázisba, akkor a mezőt a @Transient annotációval tranziensnek nyilváníthatjuk.

3.3. A mezők perzisztenciája. Kapcsolatok

A JPA ezután meghatározza, hogyan kell kezelnünk a különböző adatbázis táblák közötti kapcsolatokat az alkalmazásunkon belül. Mint láttuk, a JPA ezt annotációkkal kezeli. Négy kapcsolati annotációt kell szem előtt tartanunk:

  1. @OneToOne
  2. @OneToMany
  3. @ManyToOne
  4. @ManyToMany

Nézzük meg, hogyan működik ez:

@Entitypublic class SteeringWheel { @OneToOne private Car car // getters and setters}

A fenti példánkban a SteeringWheel osztály egy-egy kapcsolatot ír le a korábbi Car osztályunkkal.

3.4. Entity Manager

Végül a javax.persistence.EntityManager osztály határozza meg az adatbázisba irányuló és onnan származó műveleteket. Az EntityManager tartalmazza a közös Create, Read, Update és Delete (CRUD) műveleteket, amelyeket az adatbázisba perzisztálunk.

JPA implementációk

Mivel a JPA specifikáció meghatározza, hogyan és mit kell perzisztálnunk, most ki kell választanunk egy implementációs szolgáltatót, amely biztosítja a szükséges kódot. Egy ilyen szolgáltató nélkül az összes releváns osztályt implementálnunk kellene, hogy megfeleljen a JPA-nak, és ez rengeteg munka!

Rengeteg szolgáltató közül választhatunk, mindegyiknek megvannak a maga előnyei és hátrányai. Amikor döntést hozunk arról, hogy melyiket használjuk, a következő néhány szempontot kell figyelembe vennünk:

  1. Projekt érettség – mióta létezik a szolgáltató, és mennyire dokumentált?
  2. Alprojektek – van-e a szolgáltatónak az új alkalmazásunk számára hasznos alprojektje?
  3. Community support – van-e valaki, aki segít nekünk, ha kritikus hibát kapunk?
  4. Benchmarking – milyen teljesítményű a megvalósítás?

Míg a különböző JPA szolgáltatók benchmarkingjával nem fogunk mélyen foglalkozni, a JPA Performance Benchmark (JPAB) értékes betekintést nyújt ebbe.

Azt leszámítva, vessünk egy rövid pillantást a JPA néhány legjobb szolgáltatójára.

Hibernate

A Hibernate alapvetően egy objektum-relációs leképező eszköz, amely a JPA implementációját biztosítja. A Hibernate az egyik legkiforrottabb JPA implementáció, hatalmas közösség támogatja a projektet.

Ez implementálja az összes javax.persistence osztályt, amelyet a cikkben korábban már megnéztünk, valamint a JPA-n túli funkciókat is biztosít – Hibernate eszközök, validálás és keresés. Bár ezek a Hibernate-specifikus API-k hasznosak lehetnek, nincs rájuk szükség olyan alkalmazásokban, amelyek csak az alap JPA-funkcionalitást igénylik.

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

A JPA-szerződés teljesítése mellett a @org.hibernate.annotations.Entity további metaadatokat ad hozzá, amelyek túlmutatnak a JPA specifikáción. Ezáltal lehetővé teszi az entitások perzisztenciájának finomhangolását. Nézzünk például néhány, a Hibernate által kínált annotációt, amely kibővíti a @Entity funkcionalitását:

  1. @Table – lehetővé teszi, hogy megadjuk az entitáshoz létrehozott táblázat nevét
  2. @BatchSize – megadja a kötegméretet, amikor entitásokat kérünk le a táblázatból

Meg kell említeni néhány olyan extra funkciót is, amelyet a JPA nem ad meg, és amelyek hasznosnak bizonyulhatnak nagyobb alkalmazásokban:

  1. Szabályozható CRUD utasítások a @SQLInsert, @SQLUpate és @SQLDelete annotációkkal
  2. Lágy törlés támogatása
  3. Immutable entitások a @Immutable annotációval

A Hibernate és a Java perszisztencia mélyebb megismeréséhez – látogasson el a Spring perszisztencia bemutató sorozatunkba.

EclipseLink

Az Eclipse Foundation által készített EclipseLink egy nyílt forráskódú JPA implementációt biztosít. Emellett az EclipseLink számos más perszisztencia-szabványt is támogat, mint például a Java Architecture for XML Binding (JAXB).

Egyszerűen fogalmazva, a JAXB ahelyett, hogy egy objektumot egy adatbázis-sorhoz perzisztálna, azt egy XML-reprezentációhoz képezi le.

A továbbiakban, ha összehasonlítjuk ugyanazt az @Entity annotáció implementációt, láthatjuk, hogy az EclipseLink ismét más kiterjesztéseket kínál. Míg a @BatchSize annotációhoz nincs annotáció, mint korábban láttuk, az EclipseLink más lehetőségeket kínál, amelyeket a Hibernate nem.

Például:

  1. @ReadOnly – meghatározza, hogy a perzisztálandó entitás csak olvasható legyen
  2. @Struct – meghatározza az osztályt, hogy leképezze az adatbázis ‘struct’ típusát

Hogy többet olvassunk arról, hogy mit kínál az EclipseLink, nézzük meg az EclipseLink with Spring című útmutatónkat.

Következtetés

Ebben a cikkben megnéztük a Java Persistence API-t, vagyis a JPA-t.

Végül feltártuk, miben különbözik a Hibernate-től és az EclipseLink-től.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.