490 likes | 629 Views
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
E N D
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 JBossEnterpriseMiddleware System (JEMS) termékek kiemelkedő része is. Mivel a JBossa 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 (JBossEnterpriseMiddleware 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 JARfileokat amihez a Hibernate-nekszü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-nakszintén benne kell legyen a projectmappában ha használni akarod a JPA API-katvagy 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.
Paradigma ütközés/Granularitás • Cím mint • Külön tábla • Külön oszlopok • Külön típus • UserDefinedType – SQL kiterjesztés • Oszlopként
Öröklődés/Polimorfizmus Hogyan tároljuk le? Polimorfikus lekérdezés?
Azonosítás • Java • Referencia szerint (==) • Érték szerint (Equals()) • SQL • Elsődleges kulcs • Mi legyen az? Név? Független kulcs?
Viszonyok • Java • M:M • SQL • 1:M • 1:1
Navigáció • 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
Az eltérés ára • 30% a programozó idejéből • 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
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.
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ó.
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 XDoclet, Middlegen, AndroMDA.
Példaprogram elkészítése NetBeans fejlesztői környezetben. • Projekt létrehozásaNetBeans-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ásaA Services panelben a Databasesfü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, CreateDatabase 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ásaAz 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 xmlben.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éseEgyszerű 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.AzId 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 idproperty-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ásaSzeretné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. • staticfinalSessionFactorysessionFactory = newAnnotationConfiguration().configure().buildSessionFactory(); 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-bena show_sqltruera á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éseHa 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.szuletesproperty alapján. A lekérdezés alakja a következő: • Query q = sess.createQuery("fromIsmerosorderbyszuletes"); 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őlIsmeros-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.