Hibernate

Report
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ó?
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
 30%
a programozó
idejéből
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  XDoclet, Middlegen,
AndroMDA.
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 sessionokat 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 sqlhez 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.

similar documents