A Java Persistence API Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem Utolsó módosítás: 2007. 11. 27. A Java Persistence API Előzm zmények Szerializálás Egyedi kevés automatizmus Hibernate, Oracle Toplink Nem szabványos Java Data Object (JDO) Interface alapú API. Használatához egy implementáció szükséges. A Persistence API ötleteket merített belőle. A Java Persistence API PersistenceAPI / 2 Előzm zmények (folyt.) JDBC Nem objektumok, hanem adatok perzisztenciáját biztosítja. EJB 2.0, Entity Bean Szabványos specifikáció és implementáció. Viszonylag bonyolult programozási modell. Az egyszerűsítési törekvések eredménye a Persistence API. A Java Persistence API PersistenceAPI / 3
Java Persistence API POJO technológia Szabványos objektum relációs leképezés. Mivel egyszerű osztályokat használ, az öröklés, polimorfizmus lehetőségei használhatók. Annotációk használatával egyszerűsíti a programozási modellt. Támogatja a cserélhető perzisztencia implementációk használatát. Támogatja az SQL nyelvű lekérdezéseket. Az eredmény objektumok kollekciója. A Java Persistence API PersistenceAPI / 4 Java Persistence API (folyt.) A perzisztencia API eszközeivel leírhatjuk az ER modellt. Az ER modell relációs modellé konvertálása automatikusan megtörténik. Az entitás osztályok példányainak (a továbbiakban "entitások") állapota egy relációs adatbbázisban tárolódik. Az állapotok és az adatbázis tartalom szinkronizálása automatikus. A Java Persistence API PersistenceAPI / 5 Alapfogalmak Entitás (Entity) Perzisztencia egység (Persistence Unit) Perzisztencia kontextus (környezet) (Persistence Context) A Java Persistence API PersistenceAPI / 6
Perzisztencia egység A csomagolás és telepítés alapegysége Menedzselt osztályok halmaza (entitások és kapcsolódó osztályok) Objektum/relációs leképzési információk Java annotációk és/vagy XML leírók Megadja a hatáskörét a lekérdezéseknek és az entitás relációknak Konfigurációs információ a perzisztence provider számára: persistence.xml A Java Persistence API PersistenceAPI / 7 Perzisztencia környezet Futás idejű alkalmazás környezet Menedzselt entitás példányok halmaza, amelyek egy perzisztencia egységhez tartoznak Entitások, amelyeket az adatbázisból olvastak be az adatbázisba fognak kiírni. Az éppen most létrehozott entitásokat is tartalmazza A Java Persistence API PersistenceAPI / 8 Perzisztencia környezet (folyt.) A perzisztencia környezet élettartama lehet: Tranzakció alapú: egy tranzakcióra kiterjedő Bővített: több egymás utáni tranzakción átívelő A context élettartamát az alkalmazás vagy a konténer menedzselheti A Java Persistence API PersistenceAPI / 9
Entitás s osztály (Entity( Class) Követelmények: A javax.persistence.entity annotációval kell megjelölni Kell legyen egy public vagy protected default konstruktor. Sem az osztály, sem a metódusok, sem a perzisztens adattagok vagy property-k nem lehetnek final minősítésűek Ha a példányait át akarjuk adni érték szerint egy távoli objektumnak (ideértve egy session bean üzleti interface-ét is), implementálnia kell a Serializable interface-t. A Java Persistence API PersistenceAPI / 10 Entitás s osztály (folyt.) Követelmények (folyt.): Leszármazhat más entitás vagy nem entitás osztályból Lehet ősosztálya nem entitás osztálynak Ilyenkor a leszármazott osztály adattagjai nem lesznek perzisztensek A perzisztens adattagok nem lehetnek public minősítésűek A perzisztens adattagok csak metódusokon keresztül érhetők el. A továbbiakban az "entitás" kifejezés egy példányt jelent A Java Persistence API PersistenceAPI / 11 Perzisztens állapot Az entitás osztály perzisztens állapotát megadhatjuk: adattagokkal property-kkel. A második esetben a JavaBean tervezés mintáit (elnevezési konvencióit) kell használnunk. A továbbiakban mindkét esetre a "perzisztens mező" kifejezést használjuk. A Java Persistence API PersistenceAPI / 12
Perzisztens mezők Típusuk az alábbiak valamelyike lehet: Java primitív típusok java.lang.string további szerializálható típusok: Java primitive típusok fedőosztályai java.math.biginteger java.math.bigdecimal java.util.date java.util.calendar java.sql.date java.sql.time A Java Persistence API PersistenceAPI / 13 Perzisztens mezők k (folyt.) további szerializálható típusok (folyt.): java.sql.timestamp programozó által definiált szerializálható típusok byte[] Byte[] char[] Character[] enumerated típusok más entitás osztályok, vagy azok kollekciói beágyazható osztályok (embeddable classes) ezeket a javax.persistence.embeddable annotációval kell megjelölni A Java Persistence API PersistenceAPI / 14 Perzisztens mezők k (folyt.) Az alábbi kollekció típusok használhatók: java.util.collection java.util.set java.util.list java.util.map és a fentiek generikus változatai. A Java Persistence API PersistenceAPI / 15
Perzisztens mezők k (folyt.) Minden mező az osztályon belül alapértelmezés szerint perzisztens lesz. Ha valamelyik mező nem a perzisztens állapot része, azt a javax.persistence.transient annotációval kell megjelölni. A Java Persistence API PersistenceAPI / 16 Egyedi azonosító (elsődleges kulcs) Minden entitás osztályban meg adni egy elsődleges kulcsot, amely a példányokat egyedileg azonosítja. Két fajtája: egyszerű kulcs a javax.persistence.id annotációval kell megjelölni összetett kulcs típusát egy kulcs osztályban kell definiálni a javax.persistence.embeddedid és a javax.persistence.idclass annotációkkal kell megjelölni. A Java Persistence API PersistenceAPI / 17 Egyedi azonosító (folyt.) Egy kulcs vagy a kulcsosztály mezőinek típusa az alábbiak valamelyike lehet: Java primitív típusok (kivéve a lebegőpontos típusokat) a fenti típusok fedőosztályai java.lang.string java.util.date java.sql.date Definálható generált kulcs is, de az csak integrális típusú lehet. A Java Persistence API PersistenceAPI / 18
Kulcs osztály A kulcs osztályra meghatározott szabályok vonatkoznak. (Lásd a tutoriált.) A Java Persistence API PersistenceAPI / 19 Kapcsolatok Az egyes entitások közötti kapcsolatok (relációk) annotációkkal definiálhatók @OneToOne @OneToMany @ManyTo One @ManyToMany Egy- és kétirányú kapcsolat definiálható. A Java Persistence API PersistenceAPI / 20 Entitás manager Az entitások életciklusát és a perzisztencia környezetet kezeli. Életciklus műveletek: persist, remove, refresh, merge Keresési műveletek find, getreference Lekérdezést végző objektumok előállítását segítő metódusok createnamedquery, createquery, createnativequery Egyéb műveletek flush, clear, contains, lock,... A Java Persistence API PersistenceAPI / 21
Entitások életciklusa A Java Persistence API PersistenceAPI / 22 Entitások életciklusa (folyt.) Életciklus műveletek: new Új entitás jön létre Entitás még nem menedzselt és nem is perzisztens persist Az entitás menedzselt állapotba kerül Az entitás a tranzakció commitjával kerül be az adatbázisba A Java Persistence API PersistenceAPI / 23 Entitások életciklusa (folyt.) remove Törli a perzisztens entitást. Tranzakció commit esetén az adatbázisból is törlődik. refresh Az entitás állapota frissül az adatbázisból. Az entitások akkor kerülnek ki (detach) a perzisztencia contextből, ha a perzisztencia context befejeződik vagy törlődik szerializációval eltávolítják őket a perzisztencia contextből. A Java Persistence API PersistenceAPI / 24
Entitások életciklusa (folyt.) merge Egy lekapcsolódott entitás állapotát átmásolja egy menedzselt entitásba Visszatér a menedzselt példánnyal, melynek perzisztens állapota megegyezik az eredetivel A Java Persistence API PersistenceAPI / 25 Entitás managerek Container-managed A Java EE konténer biztosítja az életciklus műveletek végrehajtását. Használja a JTA (Java Transaction Architecture) API szolgáltatásait. Igénylése (injection) @PersistenceContainer EntityManager em; A Java Persistence API PersistenceAPI / 26 Entitás managerek (folyt.) Alkalmazás által managelt perzisztencia (application-managed entity managers) az életciklus műveleteket maga az alkalmazás kezeli nem kell hozzá a Java EE konténer (desktop alkalmazások is használhatják a perzisztencia API-t.) Igénylése (injection) @PersistenceUnit EntityManagerFactory emf; A fenti osztály segítségével hozható létre a megfelelő entitás manager: EntityManager em = emf.createentitymanager(); A Java Persistence API PersistenceAPI / 27
Objektum reláci ció leképez pezés Van egy default leképezés táblanév az osztálynév oszlopnév a mezőnév az embedded objektumok mezői is oszlopok lesznek A @Id-vel jelölt mező az elsődleges kulcs kapcsolatok leképezése a szokásos módon A default leképezés annotációkkal felülírható Az öröklés leképezése is szabályozható. A Java Persistence API PersistenceAPI / 28 Lekérdez rdezés Eszköz: Java persistence query language (gyakorlatilag szabványos SQL) natív SQL Statikus lekérdezések: annotációkkal vagy XML-el definiálhatók névvel ellátottak névvel vagy pozícióval lehet a paraméterekre hivatkozni Dinamikus lekérdezés az SQL parancs stringet futás időben hozom létre A Java Persistence API PersistenceAPI / 29 Lekérdez rdezés s (folyt.) A lekérdező nyelv a szokásos SQL elemeket tartalmazza, de objektumokon manipulál. A lekérdezés eredménye nem tábla, hanem objektumok kollekciója. A Java Persistence API PersistenceAPI / 30
Hivatkozások Java EE Tutoriál (java.sun.com) Molnár István, Zsemlye Tamás: Java Persistence API (SUN Hungary), Magyarországi Web Konferencia, 2007. http://web.conf.hu/2007/program/t/jpa (a link ellenőrizve: 2007. 11. 27.) A Java Persistence API PersistenceAPI / 31