Transcript Hibernate

Nem ezzel nem lehet embereket hibernálni! DE akkor mit lehet?

A válasz pedig ezekben a diákban rejlik.

 

Mi a Hibernate?!

Relációs perzisztencia Javához és .NET-hez A Hibernate egy nagy teljesítményű objektumrelációs perzisztencia és adatbázis lekérdező (query) szolgáltatás. A Hibernate lehetővé teszi az objektum-orientált elvet követő perzisztens osztályok létrehozását beleértve az asszociációt, öröklődést, polimorfizmust, kompozíciót, kollekciót. A Hibernate segítségével saját, hordozható SQL kiterjesztésében (HQL) is történhet a lekérdezés, valamint natív SQL-ben is, vagy pedig objektum-orientált Criteria és Example API segítségével. Más perzisztencia megoldásoktól eltérően a Hibernate nem rejti véka alá az SQL erejét és garantálja, hogy a relációs technológiába és tudásba tett befektetés mindig érvényes marad. Az LGPL nyílt forráskódú licenc a Hibernate és NHibernate használatát nyílt forráskódú valamint kereskedelmi projektekben is lehetővé teszi.

 A Hibernate egy professzionális nyílt forráskódú projekt, és egyben a JBoss Enterprise Middleware System (JEMS) termékek kiemelkedő része is. Mivel a JBoss a Red Hat divíziójává vált, így a Red Hat-től megszokott professzionális támogatást élvezhetik a felhasználók.

Mi a Hibernate?!(Röviden)

 A Hibernate egy rendkívül kényelmes JPA alapú ORM rendszer. Az ember létrehoz néhány felcímkézett osztályt, és ide tárolja az adatokat. A Hibernate pedig szinte láthatatlanul elvégzi az adatbázis leképzést, és a kapcsolódó adatbázis műveleteket.

Mi a Hibernate?!(Röviden)

 Híd az objektumorientált és a relációs szemlélet között  Réteg a DB és az alkalmazás között  A JEMS (JBoss Enterprise Middleware System) része  Nyílt forráskód  A leképezéssel kapcsolatos munka 95% át megspórolja  Támogatja:  OO perzisztens osztályok kezelése,  asszociációt, öröklődést, polimorfizmust,  kompozíciót, kollekciót

A Hibernate története

 A Hibernate 2001-ben lett elsőként kiadva mint egy alternatív EJB2 stílusu entitás „babok”.

 2003-ban a Hibernate2 kiadásra került mely rengeteg hibajavítást és újítást tartalmazott az első verzióhoz képest.

 A legutolsó verzió pedig a 2010-es 3.6.5-ös. Viszont már készül a 4.0-ás verzió melynek az alpha verziója már letölthető és tesztelhető.

Hibernate telepítése

 A JDK 1.5 vagy magasabb verzió szükséges a telepítéshez illetve a Hibernate core 3.6-os kell  hibernate3.jar-nak a project mappában kell szerepelnie.

 A lib/required/ mappa tartalmazza a JAR fileokat amihez a Hibernate-nek szüksége van. Az összes jar ebben a mappában szintén benne kell lennie a project mappájában.

 The /lib/jpa/ mappa tartalmazza a JPA API JAR-t. Ennek a JAR file-nak szintén benne kell legyen a projectmappában ha használni akarod a JPA API-kat vagy a JPA magyarázatokat.

Hibernate telepítése

 Ha le akarjuk „buildelni” a programot ahhoz még szükségünk van Maven-re.

 Van viszont egy másik gyorsabb módja is a Hibernate telepítésének ez pedíg a NetBeans rendszer. Egyszerűen meglátogatjuk a netbeans.org –ot, letöltjük és telepítjük a programot és amikor javas alkalmazast kezdünk írni a framework-nel (keretrendszer) kivalasztjuk hogy adja hozza a hibernatet.

A hibernate müködése

Paradigma ütközés/Granularitás

9

Paradigma ütközés/Granularitás

 Cím mint  Külön tábla  Külön oszlopok  Külön típus   User Defined Type – SQL kiterjesztés Oszlopként 10

Öröklődés/Polimorfizmus

 Hogyan tároljuk le?

 Polimorfikus lekérdezés?

11

Azonosítás

 Java  Referencia szerint (==)  Érték szerint (Equals())  SQL  Elsődleges kulcs  Mi legyen az? Név? Független kulcs?

12

Viszonyok

 Java  M:M  SQL  1:M  1:1 13

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 14

Az eltérés ára

 Bonyolult adatbázis absztrakciós réteg  Projekt bukás lehet  Az objektum réteg átalakítása, hogy megfeleljen a relációs rétegnek  JDBC  Strukturális kényszereket legalább háromszor meg kell adni (insert/update/delete)  DAO 15

Architektúra

16

Architektúra

17

Architektúra

18

Fogalmak:

    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.

19

Fogalmak:

   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ó.

20

Hibernate- felépítés

 3 rész:  Java osztály  Relációs adatbázisbeli táblák  Leíró (descriptor)     Definiálja a konverziós szabályokat A nyelvezete inkább java-centrikus 2 fajtája van:  Xml file (*.xml.hbm kiterjesztés)  Annotáció Sokan kézzel szerkesztik pedig  AndroMDA.

XDoclet, Middlegen, 21

Példaprogram elkészítése NetBeans fejlesztői környezetben.

 Projekt létrehozása NetBeans-ben létre kell hozni egy Java Application projektet Hibernate Hello World néven.

A projekt gyökérkönyvtárában hozz létre egy lib nevű könyvtárat. Ide érdemes összegyűjteni az összes szükséges jar-t. Másold be a mellékelt Hibernate és az adatbázis meghajtó jar-okat. Ezután a könyvtár tartalmát add hozzá a projekt libraries-hez.

Példaprogram elkészítése NetBeans fejlesztői környezetben.

 Adatbázis példány létrehozása A Services panelben a Databases fült megnyitva lehet látni a regisztrált adatbázis kezelőket és az adatbázis kapcsolatokat. Itt a Java DB adatbázis szerverre jobb egérgombbal kattintva, Create Database menüt választva hozz létre egy új adatbázist. A példában az adatbázis neve HibernateHelloWorld lesz, felhasználói név user, jelszó password.

Ha sikerült létrehozni az adatbázist akkor a kapcsolatok közt annak meg kell jelennie. A HibernateHelloWorld kapcsolatára jobb klikk, és connect. Ezután lehet az adatbázis sémában böngészni, lekérdezni a táblák tartalmát, újakat létrehozni, SQL szkripteket futtatni stb. Jelenleg pár rendszertáblát leszámítva mást nem látunk.

Példaprogram elkészítése NetBeans fejlesztői környezetben.

A Hibernate konfigurálása Az egész Hibernate rendszert érintő beállításokat a hibernate.cfg.xml

állományban kell megadni. Ezt az src könyvtárba kell rakni.

Itt kell megadni az adatbázist amihez szeretnénk kapcsolódni(url, név, jelszó), az adatbázis JDBC driver-ét, és az adatbázis kezelő dialektusát. Ez utóbb azért szükséges, mert a különböző DMBS gyártók különféle SQL nyelvjárást beszélnek, de a Hibernate-on keresztül egységes módon tudjuk kezelni az adatainkat és ehhez meg kell adni a konverziót végző dialektus osztályt.

Hibakeresésnél jól jöhet, ha látjuk milyen sql utasításokkal kommunikál a Hibernate az adatbázissal. Erre 3 property is van. Van egy hasznos segédprogram, amivel a entitás osztályok alapján lelehet generálni az adatbázis sémát. Ez a hbm2ddl.auto, amit minden SessionFactory létrehozáskor törli az adatbázist, és újragenerálja az üres sémát. Érdemes ezzel legenerálni a sémát, és ha nem szeretnénk, hogy letörölje az adatbázist, akkor a következő indítás előtt kommentezzük ki a sorát az xml ben.

A példa alkalmazás Hibernate Log4j-t használ a belső eseményeinek logolásásra. Ezért a hibernate.cfg.xml mellé még egy log4.xml állományt is kell készítenünk. Ezt is helyezzük be az src könyvárba.

Példaprogram elkészítése NetBeans fejlesztői környezetben.

 Entitások készítése Egyszerű alkalmazás révén csak egyetlen entitás osztályt fogunk létrehozni. Legyen a neve Ismeros és tárolja le a nevét, lakhelyét, és a születési dátumát. Követlejük meg, hogy egy ismerősnek mindig legyen neve (nem null megszorítás), és ez mindenkinél legyen más (unique megszorítás). A születési dátum az évet, hónapot és a napot tartalmazza.

Létre kell hozni egy Ismeros nevű osztályt, a definíció felett egy @Entity annotációval. Ezzel jelezzük, hogy ez egy adatbázisba leképezett osztály. A hibernate.cfg.xml-ben minden egyes @Entity-vel ellátott osztályt regisztrálni kell (mapping tag)

Példaprogram elkészítése NetBeans fejlesztői környezetben.

 A névhez, lakcímhez és születési időhöz létre kell hozni a megfelelő getter és setter metódust. Ezeken keresztül fogjuk mi, és a hibernate kezelni az objektumot. A Hibernate automatikusan leképezi a property-ket, de ha plusz információt akarunk megadni, akkor a getter felé kell helyezni a megfelelő annotációt. A @Column-al lehet a generálandó tábla oszlopára információkat adni. pl. nem null megszorítást, egyediség megoszrítást, hossz korlátot, oszlop nevét stb. Date típusú property-k fölé kötelező megadni, hogy miként legyen tárolva: @Temporal annotációval, ahol a TIME időt jelent dátum rész nélkül, DATE dátumot jelent időrész nélkül, és a TIMESTAMP dátumot és időt egyszerre.

Példaprogram elkészítése NetBeans fejlesztői környezetben.

 Az entitás osztályok definícióira teljesülnie kell, hogy @Entity annotációval vannak ellátva. Ezen kívül rendelkezniük kell paraméter nélküli konstruktorral, és id-val. Az id általában egy szintetikus azonosító, nem rendelkezik semmilyen értelmes tartalommal. Ez képezi a generált táblákban az elsődleges kulcsot, és ezen id alapján tudja a Hibernate nyomon követni az egyes entitásokat.Az Id létrehozásához, csak definiálni kell egy Long típusú property-t, és el kell látni a getter metódusát @Id és @GeneratedValue annotációval. Az utóbbi jelöli azt, hogy új entitás tárolásakor (save) a hibernate-ra bízzuk az id értékének legenerálását és beállítását. A generált id értékét nem szabad megváltoztatni, ezért a láthatóságát érdemes leszűkíteni csomag szintűre. Az id property-t a többi property-előtt szokás definiálni.

Példaprogram elkészítése NetBeans fejlesztői környezetben.

 Entitások tárolása Szeretnénk létrehozni pár Ismeros objektumot és perzisztensen letárolni őket az adatbázisban. A Main osztályban van erre példa.

A bekonfigurált, adatbázishoz csatlakozott Hibernate rendszert a SessionFactory képviseli. Ebből alkalmazásonként egy példányt szokás készíteni, amit például egy statikus mezőben érdemes eltárolni.

Példaprogram elkészítése NetBeans fejlesztői környezetben.

 static final SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionF

actory() ; A session factory-t arra használjuk, hogy a Hibernate oldali munkaegységet képviselő session objektumokat létrehozzuk.

 Session sess = sessionFactory.openSession(); A session okat létrehozás után close() metódussal le kell zárni.

Ha létrehoztunk egy Ismeros objektumot akkor azt a Session.save() metódussal tudjuk az adatbázisba lementeni. Ekkor kap az entitásunk id értéket is.

Példaprogram elkészítése NetBeans fejlesztői környezetben.

 A példán kivétel, és tranzakció kezelés is szerepel. Érdemes ezt a mintát követni, csak a kommentekkel jelölt részt kell cserélni, a többi maradhat.

Az adatbázist a munka kezdetén ne felejtsük elindítani. Ha sikeresen lefutott a példa, akkor NetBeans-ban, az adatbázis kapcsolatot frissítve és kibontva látnunk kell a létrejött Ismeros táblát és a 4 sort. A mellette lévő hibernate_unique_key tábla az id generáláshoz jött létre. A hibernate.cfg.xml-ben a show_sql true ra állításával látni lehet az elküldött insert utasításokat. (A paraméterezett sql utasítások miatt a konkrét adatok helyett csak kérdőjelekek lesznek.)

Példaprogram elkészítése NetBeans fejlesztői környezetben.

  Entitások lekérdezése Ha az előző pontban feltöltött entitásokat leszeretnénk kérdezni akkor arra két Hibernate-os eszköz is rendelkezésre áll. Az egyik a HQL (Hibernate Query Languege) nyelvű vagy a Criteria alapú lekérdezés.

A HQL lekérdezéseket sztringekkel adjuk meg. Ez egy sql hez hasonló, de objektum orientált lekérdező nyelv. Benne az entitásokon kell lekérdezéseket definiálni, nem pedig a táblákon. Például leszeretném kérdezni az összes Ismeros típusú objektumot, és rendezni az Ismeros.szuletes

property alapján. A lekérdezés alakja a következő: Query q = sess.createQuery("from Ismeros order by szuletes"); List ismerosok = q.list(); kiirIsmerosok(ismerosok);

Példaprogram elkészítése NetBeans fejlesztői környezetben.

 A Query.list() metódus hajtja végre a lekérdezést, és tér vissza az Ismeros objektumok rendezett listájával. Használat előtt még az egyes elemeket kasztolni kell Object-ről Ismeros-re.

A Criteria lekérdezéseket különböző objektumok kompozíciójával adjuk meg.

 Criteria q = sess.createCriteria(Ismeros.class).addOrder(Order.asc

("szuletes")); List ismerosok = q.list(); kiirIsmerosok(ismerosok);  Az eredmény ugyanaz.