1 / 41

10. Adatkezelés JPA-Hibernate

10. Adatkezelés JPA-Hibernate. Dr. Bilicki Vilmos Szegedi Tudományegyetem Informatikai Tanszékcsoport Szoftverfejlesztés Tanszék. Tartalom. JDBC Connection Statements Resultset Tranasactions JPA Entitás ORM Lekérdezések Hibernate Betöltés Gyrostárak. Problémák.

bary
Download Presentation

10. Adatkezelés JPA-Hibernate

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 10. Adatkezelés JPA-Hibernate Dr. Bilicki Vilmos Szegedi Tudományegyetem Informatikai Tanszékcsoport Szoftverfejlesztés Tanszék

  2. Programrendszerek fejlesztése Tartalom • JDBC • Connection • Statements • Resultset • Tranasactions • JPA • Entitás • ORM • Lekérdezések • Hibernate • Betöltés • Gyrostárak

  3. Programrendszerek fejlesztése Problémák • Adatbázis elérés Java-ból - JDBC • ACID vs. Hosszú Munkamenetek (Unit of Work?) • Relációs vs. Objektum Orientált • Memória vs. Adatbázis

  4. Perzisztens objektum: a létrehozó program állapotától függetlenül is létezik Az objektumhierarchia egy részének kimentése/betöltése transzparens módon Fájlba (Object Serialization API) Kevésbé típusos (bájtsorozat) Objektum referenciák?Keresések?Biztonság? Objektum orientált adatbázisba Nem kellene átkonvertálni(objektumrelációk) Még nem elég hatékony az adatkezelés Nem népszerűek, kiforratlanok, nincs komplett implementáció Relációs adatbázisba Nagyon macerás a leképezés/átkonvertálás Programrendszerek fejlesztése Perzisztencia

  5. JDBC • Platform és szállító független • Egy egyszerű Java API a programozók számára • JDBC meghajtó menedzser • Gyártó specifikus meghajtók mellyel az egyes gyártók optimalizálhatják a kapcsolatot • Hasonló megoldás mint a Microsoft igen sikeres ODBC megoldása (C nyelv) • Az adatok titkosítása az szállító meghajtó feladata Programrendszerek fejlesztése

  6. JDBC kapcsolat felépítés • Connection Pooling • ConnectionPoolDataSource interfész • 1:X kapcsolat • fizikai kapcsolatok helyett logikai kapcsolatok • a kliens nem érzékel semmit • Alkalmazás szerver biztosítja ezt a funkciót Programrendszerek fejlesztése

  7. Programrendszerek fejlesztése JDBC objektumok

  8. Programrendszerek fejlesztése Statement • paraméter nélküli kifejezések • egyszerű SQL kifejezések létrehozására használandó • executeQuery ( • egyszerű lekérdezés Select * from t • executeUpdate • INSERT • UPDATE • DELETE • CREATE TABLE • DROP TABLE • a visszatérési értéke egy integer mely az érintett sorok számát adja meg egyébként 0 • execute • olyan esetekben használják amikor több mint egy válasz érkezik Connection con = DriverManager.getConnection(url, "sunny", ""); Statementstmt = con.createStatement(); ResultSetrs = stmt.executeQuery("SELECT a, b, c FROM Table2");

  9. Programrendszerek fejlesztése Prepared Statement • a Statement alosztálya • előre fordított SQL kifejezések • egy-vagy több paramétere lehet (IN) • több metódust használhatunk az IN paraméterek beállítására • sokkal hatékonyabb lehet mint a Statement objektum (előre fordított) • gyakran használt kifejezések létrehozására használandó • többször futtatható, a beállított paraméterek megmaradnak

  10. Programrendszerek fejlesztése Callable Statement • segítségével SQL tárolt eljárásokat futathatunk • supportsStoredProcedures() • getProcedures() • {? = call procedure_name[(?, ?, ...)]} • IN paraméterek • OUT paraméterek • regisztrálni kell • nincs külön lehetőség nagy adatok kezelésére • INOUT paraméterek

  11. SZTE-Siemens JEE alapok Result Set • Az előző három objektum eredménye • Alapesetben nem írható és nem görgethető (csak egyszer lehet rajta végigmenni) • A JDBC 2.0 API ezeket lehetővé teszi • Nem minden meghajtó képes erre (pl.: postgresql) • getXXX(név vagy sorszám) metódusok (select a, select * ) • getMetaData • updateRow(), insertRow(), deleteRow(), refreshRow() • JDBC 2.0 • previous • first • last • absolute • relative • afterLast • beforeFirst

  12. SZTE-Siemens JEE alapok Result set (JDBC 3.0) • Kurzor: • TYPE_FORWARD_ONLY • TYPE_SCROLL_INSENSITIVE • TYPE_SCROLL_SENSITIVE • Párhuzamosság • CONCUR_READ_ONLY • CONCUR_UPDATABLE • Tarthatóság: • HOLD_CURSORS_OVER_COMMIT • CLOSE_CURSORS_OVER_COMMIT • Használata: Connectionconn = ds.getConnection(user, passwd); Statementstmt = conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT); ResultSetrs = stmt.executeQuery(“select author, title, isbn from booklist”);

  13. SZTE-Siemens JEE alapok Tranzakciók • bankbetét átutalás • A helyen csökken • B helyen növekszik • egy tranzakció egy vagy több kifejezést tartalmaz melyek csak együtt hajtódnak végre (egyébként visszaállítja az eredeti állapotot - rollback) • a kapcsolat objektum auto-commit módban van azaz minden egyes kifejezést külön külön hajt végre • ha ez le van tiltva akkor a tranzakció addig nem ér véget amíg a commit vagy rollback metódusokat meg nem hívják • a tranzakció kezdete az auto-commit mód letiltásával kezdődik • a JDBC 2.0 API segítségével elosztott tranzakciókat is végrehajthatunk • JDBC 3.0 SavePoint

  14. SZTE-Siemens JEE alapok con.setAutoCommit( false ); bError = false; try { for( ... ) { if( bError ) { break; } stmt.executeUpdate( ... ); } if( bError ) { con.rollback(); } else { con.commit(); } } / catch ( SQLException SQLe) { con.rollback(); ... } // end catch catch ( Exception e) { con.rollback(); ... } // end catch

  15. Programrendszerek fejlesztése Elosztott tranzakciók • Tranzakció kezelő (JTA) • JDBC meghajtó: • XADataSource • XAConnection • XAResource • Alkalmazás szerver

  16. Problémák • ORM • Gyorstítótárazás • Szolgáltatás logika • Tranzakciók Programrendszerek fejlesztése

  17. Hogyan nézzen ki a lementet objektum? Hogyan definiáljuk a leképezést leíró metaadatot? Hogyan képezzük le a származási hierarchiákat? Hogyan kezeljük az objektumok egyezőségét? Hogyan működik együtt az ORM az üzelti logikával futási időben? Mi az objektum életciklusa? Milyen aggregáló és rendező megoldásokat biztosít? Hogyan kezeljük az asszociációkat? Tranzakciók, párhuzamosság? Gyorsítótárazás? Programrendszerek fejlesztése ORM kérdések

  18. Programrendszerek fejlesztése ORM paradigma ütközés • Kollekciók • Identitás • Származás • Navigáció

  19. Fejlesztési ciklus (CRUD - @Entity + @Id) Karbantarthatóság Sebesség Gyártó függetlenség Programrendszerek fejlesztése ORM előnyök

  20. Programrendszerek fejlesztése Java Persistence API • Java Community Program: JSR 317 • Entitások kezelése (annó EJB 2.x < Entitás Bab) • Könnyűsúlyú perzisztens domain objektum • Öröklődés, Polymorfikus viselkedés • Absztrakt, Konkrét • Az állapota a JavaBab konvencióknak megfelelő tulajdonságok halmaza

  21. Programrendszerek fejlesztése Entitás • @Entity + @Id • Mező vs. Tulajdonság hozzáférés • Mellékhatások (Mező+) • Tábla @Table • Több tábla @SecondaryTable • View • Replikációs • History

  22. Programrendszerek fejlesztése Viszonyok • Viszonyok (egyirányú, kétirányú) • @OneToOne (JoinTable, mappedBy) • @OneToMany (JoinColumn, JoinTable , mappedBy) • @ManyToOne (JoinTable) • @ManyToMany (JoinTable, mappedBy)

  23. Programrendszerek fejlesztése Identitás • Referencia vs. Adatbázis elsődleges kulcs • Nem célszerű adatbázis alapú azonosítást használni • Célszerű adatbázis alapú azonosítást használni • Sok fajta ID generáló megoldás

  24. Programrendszerek fejlesztése Származás • A gyökér osztály dekorálásával határozható meg a tárolási stratégia • Egy tábla osztály hierarchiánként • Megkülönböztető oszlop • Egy tábla minden osztálynak • Gyenge a polymorfikus viselkedése (Union) • Join stratégia ahol csak a saját adatagok vannak a táblában • Lassú (sok JOIN)

  25. Navigáció? Java egzakt Obejktum gráf bejárás x.d.g.getZ(); SQL tetszőleges: N+1 select problémája Minimalizálni kell a kérések számát – join Előre kell tudnunk mit akarunk lekérni User User join Billing details Programrendszerek fejlesztése Navigáció

  26. Programrendszerek fejlesztése Entitás állapotok • Tranziens: • Az újonnan példányosított (a new operátorral) objektumok még nem perzisztensek. • Ezek az objektumok nem lehetnek tranzakcionálisak, azaz a rajtuk végrehajtott bármely módosítási művelet nem lehet része tranzakciónak. • Ha egy tranziens objektumot perzisztálni akarunk, vagy más szóval a tranziens állapotból perzisztensbe akarjuk helyezni, a perzisztencia menedzser save függvényét kell meg hívni az objektumra, vagy egy perzisztens objektumból hivatkozni kell a tranziens objektumra. • Perzisztens: • A perzisztens állapotban lévő objektumpéldány rendelkezik egy elsődleges kulccsal azonosított érvényes adatbázis bejegyzéssel. • A tranzakció végeztével csak azok a perzisztens entitások kerülnek szinkronizálásra, amelyek módosultak. Ezt a folyamatot dirtychechking-nek nevezik.. • Leválasztott (detached): • A perzisztens objektumok a tranzakció végeztével is léteznek és tartalmaznak adatokat, azonban leválasztódnak a viszony bezáródásával.

  27. Programrendszerek fejlesztése Életciklus • Adatbázis vs. Gyorstár vs. Memória • Entitás létrehozása • Entitás törlése • Szinkronizálás • Frissítés • Lecsatolt entitások • Menedzselt entitások • Állapot betöltése

  28. Programrendszerek fejlesztése Entitás Menedzser • Az entitásokat az Entitás Menedzser – EM kezeli • Konténer által kezelt • Automatikusan propagálódik • Alkalmazás által kezelt • A tranzakciókat nem propagálja automatikusan • Nem szálbiztos • Fontosabb metódusai: • persist() • find() • update() • remove()

  29. Programrendszerek fejlesztése Párhuzamosság • Párhuzamos hozzáférés esetén az adtaforrásban lévő adathoz egy időben többen is hozzáférnek • Optimista zárolás • Írás előtt megnézi, hogy módosították-e • Verzió mező • Pesszimista zárolás • Amíg az adatot módosítja addig zárolja

  30. Programrendszerek fejlesztése Zárolási szintek • OPTIMISTIC – olvasási zárolás • OPTIMISTIC_FORCE_INCREMENT – olvasási zárolás és megnöveli a verziószámot • PESSIMISTIC_READ – Hosszú távú olvasási zárolás. Más tranzakciók olvashatják, de nem írhatják • PESSIMISTIC_WRITE – Írási zárolás, mások nem olvashatják • PESSIMISTIC_FROCE_INCREMENT – Olvasási zárolás és verzió növelés • READ - OPTIMISTIC • WRITE - PESSIMISTIC_FROCE_INCREMENT • NONE

  31. Programrendszerek fejlesztése Bab Validálás • Nem csak JPA képesség • A Web és az EJB konténernek is része • Mező és tulajdonsághoz köthető szabályok • Javax.validation.constrains – bővíthető • Idő + minta + érték

  32. Programrendszerek fejlesztése Lekérdező nyelv • SQL-hez hasonló de Objektum Orientált • Lehetővé teszi az objektumgráfon lévő elemek címzését

  33. Programrendszerek fejlesztése Hibernate

  34. SessionFactory (net.sf.hibernate.SessionFactory): Egy tárolóhely a lefordított mappingek részére. Innen érhető el a Session és a ConectionProvider. Tartalmazhat egy másod-szintű tárolót, ami a tranzakciók között használhatók fel processz vagy klaszterszinten. Session (net.sf.hibernate.Session): Ez egy rövid életű objektum, ami egy kapcsolatot reprezentál a tároló és az applikáció között, Magába foglal egy JDBC kapcsolatot. Innen kérhetőek el a tranzakció objetumok. Egy elsőszintű tároló tartozik hozzá a perzisztens objektumok számára. Amikor lépkedünk az objektum gráfban, vagy azonosító alapján keresünk, akkor van rá szükség. Perzisztens Objektumok: Szintén rövid életű objektumok, amelyek pontosan 1 session-el vannak kapcsolatban. Amikor a session bezárul, akkor szabaddá válnak és más applikációs szintek is használhatják. Tranziens Objektumok: Akkor beszélünk tranziens objektumokról amikor még sohasem voltak elmentve (tehát még nem voltak perzisztensek), így például ezeknek általában még nincs azonosítójuk. Programrendszerek fejlesztése Fogalmak:

  35. Tranzakció (net.sf.hibernate.Transaction): Rövid életű objektum ami egy atomi egységet valósít meg (tehát vagy teljesül az összes művelet vagy egyik sem, ha valamilyen hiba folytán nem teljesül akkor vissza kell tudni vonni a már bekövetkezett módosításokat). Egy session-ben több tranzakció is megvalósulhat. ConnectionProvider (net.sf.hibernate.connection.ConnectionProvider): Innen kérhetjük el a JDBC kapcsolatokat (itt a kapcsolatok tárolódnak is). Leválasztja az alkalmazást az alsóbb rétegektől (DataSource, DriverManager). A fejlesztő által implementálható. TransactionFactory (net.sf.hibernate.TransactionFactory): Itt kérhetjük el a tranzakció objektumokat. A fejlesztő által implementálható. Programrendszerek fejlesztése Fogalmak:

  36. Programrendszerek fejlesztése Perzisztencia

  37. CRUD Lekérdezés Tranzakció Gyorstár Programrendszerek fejlesztése Perzisztencia menedzser

  38. Azonosító alapján HQL Kritérium alapján Minta alapján Programrendszerek fejlesztése Objektumok betöltése

  39. Lazy Csak proxy Batch Ha egy proxy-t fel kell oldani akkor többet is felold Eager Mindent betölt Programrendszerek fejlesztése Betöltés

  40. Programrendszerek fejlesztése Optimalizálás - Gyorstárak

  41. Programrendszerek fejlesztése Tartalom • JDBC • Connection • Statements • Resultset • Tranasactions • JPA • Entitás • ORM • Lekérdezések • Hibernate • Betöltés • Gyrostárak

More Related