- Bevezetés
- Objektum-relációs leképezés
- Egy bevezetés a JPA-ba
- 3.1. A JPA és a Java adatmegőrzési rendszer közötti kapcsolat. Entity
- 3.2. A JPA által leírt entitások a JPA által leírt entitásokhoz tartoznak. Mezőperzisztencia
- 3.3. A mezők perzisztenciája. Kapcsolatok
- 3.4. Entity Manager
- JPA implementációk
- Hibernate
- EclipseLink
- Következtetés
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:
- @OneToOne
- @OneToMany
- @ManyToOne
- @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:
- Projekt érettség – mióta létezik a szolgáltató, és mennyire dokumentált?
- Alprojektek – van-e a szolgáltatónak az új alkalmazásunk számára hasznos alprojektje?
- Community support – van-e valaki, aki segít nekünk, ha kritikus hibát kapunk?
- 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:
- @Table – lehetővé teszi, hogy megadjuk az entitáshoz létrehozott táblázat nevét
- @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:
- Szabályozható CRUD utasítások a @SQLInsert, @SQLUpate és @SQLDelete annotációkkal
- Lágy törlés támogatása
- 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:
- @ReadOnly – meghatározza, hogy a perzisztálandó entitás csak olvasható legyen
- @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.