6
INFOTEH-JAHORINA Vol. 11, March 2012. - 1192 - Objektno-relaciono mapiranje podataka sa Hibernate okvirom Branislav Gojić, Mile Živković studenti prvog ciklusa studija Slobomir P univerzitet, Fakultet za informacione tehnologije Doboj, Bosna i Hercegovina [email protected] , [email protected] Maja Živković student drugog ciklusa studija Univerzitet u Banjoj Luci, Elektrotehnički fakultet Banja Luka, Bosna i Hercegovina [email protected] Sadržaj—U ovom radu će biti predstavljen Hibernate okvir, njegove osnovne funkcionalnosti, Hibernate Core i komponente koje se mogu koristiti uz Hibernate Core. Hibernate okvir ima bogat API, pruža mnogo mogućnosti. Orijentisan je ka programeru, tako što o mnogim zadacima ne mora da razmišlja, Hibernate okvir ih izvrsava umjesto programera, tako mu se ostavlja vremena da se bavi poslovnim problemima aplikacije. Tehnologija je vrlo sofisticirana i lagana za rad. Bitno se smanjuje vrijeme kodiranja i broj linija koda. Ključne riječi-Hibernate; JAVA; mapiranje; (key words) I. UVOD Hibernate je proizvod kompanije JBoss (kompanija koja pripada Red Hat-u). Inače, kompanija JBoss se specijalizovala za open source rješenja srednjeg sloja (middlware) aplikacije. Svako rješenje podržava mreža programera, oni koji su učestvovali u razvoju tog rješenja i oni koji su njegovi korisnici. Hibernate je licenciran pod open source GNU Lesser General Public License (LGPL). Slobodno se može preuzeti i koristiti za razvoj aplikacija. Naravno licenca dozvoljava da se aplikacije koje koriste Hibernate slobodno distribuiraju. Hibernate je servis za objektno-relaciono perzistiranje podataka i dizajn upita. Za Hibernate okvir se može reći da je jedno od najmoćnijih i najfleksibilnijih rješenja za objektno- relaciono perzistiranje podataka, kompleksni projekat koji namjerava da postane kompletno rješenje za perzistenciju podataka u Javi. Predstavlja medijatora između aplikacije i baze podataka, a ostavlja programera da se koncentriše na poslovne procese aplikacije, dok neke procese izvršava sam alat. Rješavanje problema preslikavanja iz objektnog modela u relacioni i obratno je jako skupo. Mnogi softver inženjeri i softver arhihekti smatraju da 30% linija koda ode na rješavanje ovog problema. Hibernate okvir samostalno mapira podatke iz objektnog modela u relacioni model ili obrnuto, tako da programer ne mora da razmišlja o ovom poslu. Hibernate eliminiše ponovno i zamorno pisanje koda i ostavlja programerima vremena za rješavanje poslovnih problema. Bez obzira koju strategiju razvoja aplikacije koristimo odozgo na dole, počevši od rešavanja poslovnih problema i izrade domenskog modela, ili odozdo na gore, počevši od postojeće šeme baze podataka. Hibernate se tipično koristi za Swing aplikacije, Servlet bazirane aplikacije, J2EE aplikacije koje koriste EJB (Entity Java Beans). EJB 3.0 Java Persistence API(JPA) koristi Hibernate 3.0 tako da značajno smanjuje perzistentni model u EJB standardu. Hibernate okvir u sebi sadrži sljedeće interfejse: Core API koji služi za pisanje perzistentnog sloja aplikacije, Extension API kojim se vrši konfigurisanje Hibernate okvira i Metadata API koji omogućava pristup meta podacima za perzistenciju podataka. Metadata API koriste aplikacije koje moraju da konfigurišu automatizovano mapiranje podataka. Hibernate okvir koristi objektno-orijentisani upitni jezik HQL, koji po sintaksi dosta liči na SQL. U Hibernate okviru se može koristiti prirodni SQL dijalekt za bazu podataka koju aplikacija koristi. II. ZAHTEVI ZA KORIŠĆENJE HIBERNATE-A Performanse računara neophodne za korišćenje Hibernate okvira: Hibernate 2 zahtjeva JDK(Java Dvelopment Kit) 1.2 ili višu(1.4.2 i 1.5.0 se preporučuju) Hibernate 3 zahtjeva JDK 1.3.1 ili višu(1.4.2 i 1.5.0 se preporučuju) 128 MB RAM 50 MB prostora na hard disku 400 MHz brzina procesora

Objektno-relaciono mapiranje podataka sa Hibernate …infoteh.etf.unssa.rs.ba/zbornik/2012/radovi/STS/STS-33.pdf · INFOTEH-JAHORINA Vol. 11, March 2012. - 1192 - Objektno-relaciono

  • Upload
    vuquynh

  • View
    220

  • Download
    5

Embed Size (px)

Citation preview

Page 1: Objektno-relaciono mapiranje podataka sa Hibernate …infoteh.etf.unssa.rs.ba/zbornik/2012/radovi/STS/STS-33.pdf · INFOTEH-JAHORINA Vol. 11, March 2012. - 1192 - Objektno-relaciono

INFOTEH-JAHORINA Vol. 11, March 2012.

- 1192 -

Objektno-relaciono mapiranje podataka sa Hibernate okvirom

Branislav Gojić, Mile Živković studenti prvog ciklusa studija

Slobomir P univerzitet, Fakultet za informacione tehnologije Doboj, Bosna i Hercegovina

[email protected], [email protected]

Maja Živković student drugog ciklusa studija

Univerzitet u Banjoj Luci, Elektrotehnički fakultet Banja Luka, Bosna i Hercegovina

[email protected]

Sadržaj—U ovom radu će biti predstavljen Hibernate okvir, njegove osnovne funkcionalnosti, Hibernate Core i komponente koje se mogu koristiti uz Hibernate Core. Hibernate okvir ima bogat API, pruža mnogo mogućnosti. Orijentisan je ka programeru, tako što o mnogim zadacima ne mora da razmišlja, Hibernate okvir ih izvrsava umjesto programera, tako mu se ostavlja vremena da se bavi poslovnim problemima aplikacije. Tehnologija je vrlo sofisticirana i lagana za rad. Bitno se smanjuje vrijeme kodiranja i broj linija koda.

Ključne riječi-Hibernate; JAVA; mapiranje; (key words)

I. UVOD Hibernate je proizvod kompanije JBoss (kompanija koja

pripada Red Hat-u). Inače, kompanija JBoss se specijalizovala za open source rješenja srednjeg sloja (middlware) aplikacije. Svako rješenje podržava mreža programera, oni koji su učestvovali u razvoju tog rješenja i oni koji su njegovi korisnici.

Hibernate je licenciran pod open source GNU Lesser General Public License (LGPL). Slobodno se može preuzeti i koristiti za razvoj aplikacija. Naravno licenca dozvoljava da se aplikacije koje koriste Hibernate slobodno distribuiraju.

Hibernate je servis za objektno-relaciono perzistiranje podataka i dizajn upita. Za Hibernate okvir se može reći da je jedno od najmoćnijih i najfleksibilnijih rješenja za objektno-relaciono perzistiranje podataka, kompleksni projekat koji namjerava da postane kompletno rješenje za perzistenciju podataka u Javi. Predstavlja medijatora između aplikacije i baze podataka, a ostavlja programera da se koncentriše na poslovne procese aplikacije, dok neke procese izvršava sam alat.

Rješavanje problema preslikavanja iz objektnog modela u relacioni i obratno je jako skupo. Mnogi softver inženjeri i softver arhihekti smatraju da 30% linija koda ode na rješavanje ovog problema. Hibernate okvir samostalno mapira podatke iz objektnog modela u relacioni model ili obrnuto, tako da programer ne mora da razmišlja o ovom poslu.

Hibernate eliminiše ponovno i zamorno pisanje koda i ostavlja programerima vremena za rješavanje poslovnih problema. Bez obzira koju strategiju razvoja aplikacije koristimo odozgo na dole, počevši od rešavanja poslovnih problema i izrade domenskog modela, ili odozdo na gore, počevši od postojeće šeme baze podataka.

Hibernate se tipično koristi za Swing aplikacije, Servlet bazirane aplikacije, J2EE aplikacije koje koriste EJB (Entity Java Beans). EJB 3.0 Java Persistence API(JPA) koristi Hibernate 3.0 tako da značajno smanjuje perzistentni model u EJB standardu.

Hibernate okvir u sebi sadrži sljedeće interfejse: Core API koji služi za pisanje perzistentnog sloja aplikacije, Extension API kojim se vrši konfigurisanje Hibernate okvira i Metadata API koji omogućava pristup meta podacima za perzistenciju podataka. Metadata API koriste aplikacije koje moraju da konfigurišu automatizovano mapiranje podataka.

Hibernate okvir koristi objektno-orijentisani upitni jezik HQL, koji po sintaksi dosta liči na SQL. U Hibernate okviru se može koristiti prirodni SQL dijalekt za bazu podataka koju aplikacija koristi.

II. ZAHTEVI ZA KORIŠĆENJE HIBERNATE-A Performanse računara neophodne za korišćenje Hibernate

okvira:

• Hibernate 2 zahtjeva JDK(Java Dvelopment Kit) 1.2 ili višu(1.4.2 i 1.5.0 se preporučuju)

• Hibernate 3 zahtjeva JDK 1.3.1 ili višu(1.4.2 i 1.5.0 se preporučuju)

• 128 MB RAM

• 50 MB prostora na hard disku

• 400 MHz brzina procesora

Page 2: Objektno-relaciono mapiranje podataka sa Hibernate …infoteh.etf.unssa.rs.ba/zbornik/2012/radovi/STS/STS-33.pdf · INFOTEH-JAHORINA Vol. 11, March 2012. - 1192 - Objektno-relaciono

- 1193 -

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="domain.naziv klase" table="naziv tabele"> <id name="id" type="long" column="ID" > <generator class="increment"/> </id> <property name="atribut 1"> <column name="kolona 1" /> </property> <property name="atribut 2"> <column name="kolona 2" /> </property> . . . <property name="atribut n"> <column name="ADDRESS"/> </property> </class> </hibernate-mapping>

• Hibernate okvir je napisan u Java programskom jeziku tako da se može izvršavati na svim operativnim sistemima na kojima se može izvršavati i Java(Windows, Unix, Linux i dr.).

• Hibernate okvir podržava sledeće baze podataka i njihove SQL dijalekte: Oracle, DB2, Sybase, MS SQL Server, PostgreSQL, MySQL, HypersonicSQL, Mckoi SQL, SAP DB, Interbase, Pointbase, Progress, FrontBase, Ingres, Infomix i Firebird.

Na osnovu navedenih zahtjeva i mogućnosti može se zaključiti da Hibernate ne zahtjeva značajne performanse računara.

III. PODEŠAVANJE HIBERNATE OKRUŽENJA I IMPLEMENTACIJA

Da bi uspješno koristili hibernate okvir, pored Hibernate-a za rad je potrebno instalirati JDK, zatim editor u kome bi se razvijala softverska aplikacija.

Kada se napravi Java aplikacija pored standardnih biblioteka potrebno je dodati sljedeće:

• antlr.jar

• asm.jar

• asm-attrs.jars

• c3p0.jar

• cglib.jar

• commons-collections.jar

• commons-logging.jar

• dom4j.jar

• hibernate3.jar

• ojdbc14.jar

• jta.jar

Fajl ojdbc14.jar je drajver za Oracle bazu podataka. Ako aplikacija koristi neku drugu bazu podataka potrebno je ovaj fajl zamijeniti odgovarajućim.

Da bi se izvršilo automatizovano objektno/relaciono mapiranje potrebno je opisati Hibernate okviru kako ti podaci treba da se transformišu iz objektnog modela u relacioni model [1]. Jednostavno, Hibernate treba da zna u kakvoj strukturi će se čuvati objekti u bazi podataka i kako će se preuzimati iz baze. Podaci o objektno-relacionom mapiranju se pišu u xml fajlovima za mapiranje i zovu se meta podaci. Naziv tabele ne mora biti indentičan nazivu domenske klase.

Umjesto XML fajla možemo koristiti direktno anotacije u kodu. Koji god način koristili Hibernate ima dovoljno informacija da generiše SQL naredbe. Programer više nije u obavezi da svaki put iznova piše ove naredbe.

Objasnit ćemo tri ključna intrfejsa iz Hibernate API-a: Session, Transaction i Query.

Session interfejs – Hibernate Session objekat predstavlja mnogo stvari u jednom. To je jednonitni nedjeljivi objekat koji predstavlja posebnu jedinicu posla sa bazom podataka. Ovaj objekat ima svoj API za upravljanje perzistencijom. Tako da može da čuva objekte u bazi i da ih preuzima iz baze. Session objekat sadrži SQL naredbe koje čekaju u redu da se sinhronizuju sa bazom podataka i mapu perzistentnih objekata kojima upravlja.

Transaction interfejs – Ovaj objekat se bavi životnim vijekom transakcije. Predstavlja viši nivo apstrakcije iznad JDBC-a. Ako se ne koristi transaction objekat, programeru ostaje jedino da koristi direktno JDBC.

Query interfejs - Sa Query objektom upit se može pisati u Hibernate orijentisanom jeziku HQL, a može se koristiti i prirodni SQL. Rezultat koji se dobija iz baze može biti jedan objekat ili lista objekata.

Page 3: Objektno-relaciono mapiranje podataka sa Hibernate …infoteh.etf.unssa.rs.ba/zbornik/2012/radovi/STS/STS-33.pdf · INFOTEH-JAHORINA Vol. 11, March 2012. - 1192 - Objektno-relaciono

- 1194 -

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class"> oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.url"> jdbc:oracle:thin:@localhost:1521:XE</property> <property name="hibernate.connection.username"> pos</property> <property name="hibernate.connection.password"> pos</property> <property name="hibernate.connection.pool_size"> 100</property> <property name="show_sql">true</property> <property name="dialect"> org.hibernate.dialect.OracleDialect</property> <property name="hibernate.hbm2ddl.auto"> update</property> <mapping resource="domain/mapping/employee.hbm.xml"/>

i

<mapping resource="domain/mapping/warehouse.hbm.xml"/> resource="domain/mapping/inventorycountdocumentitem.hbm.xml"/> </session-factory> </hibernate-configuration>

<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class"> oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.url"> jdbc:oracle:thin:@localhost:1521:XE</property> <property name="hibernate.connection.username"> pos</property> <property name="hibernate.connection.password"> pos</property> <property name="hibernate.connection.pool_size"> 100</property> <property name="show_sql">true</property> <propertyname="dialect"> org.hibernate.dialect.OracleDialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <mapping class="domain.naziv klase"/> </session-factory> </hibernate-configuration>

IV. KONFIGURACIJA HIBERNATE OKVIRA Korišćenje Hibernate okvira započinje instanciranjem

SessionFactory objekta, koji nastaje od Configuration objekta. Configuration objekat se može zamisliti kao prezentacija konfiguracionog fajla za Hibernate okvir [2].

Configuration objekat se pravi tako što se automatski detektuje konfiguracioni fajl.

Kako program na osnovu ove linije koda zna gde je konfiguracioni fajl? Kada se pozove konstruktor new Configuraion(), Hibernate traži fajl hibernate.properties u glavnom folderu projekta. Ukoliko ih pronađe svi hibernate.prperties fajlovi su učitani i dodati u Configuration objekat. Kada se pozove metoda configure(), Hibernate traži fajl hibernate.cfg.xml u glavnom folderu projekta i baca izuzetak ukoliko ga ne nađe. Fajl hibernate.cfg.xml možete postaviti i u neki drugi folder, ali je onda obavezno u metodi configure navesti putanju do njegovog fajla.

Sljedi kreiranje konfiguracionog fajla za Hibernate aplikaciju. Preporučuje se da se konfiguracioni fajl zove hibernate.cfg.xml i da se postavi u source direktorijum. Tako će ovaj fajl ostati u glavnom folderu projekta nakon kompajliranja i Hibernate okvir će ga automatski naći.

V. HIBERNATE ANOTACIJE Hibernate zahtjeva meta podatke koji vrše transformaciju

od jedne reprezentacije podataka u drugu. Hibernate obezbeđuje, pored xml fajlova, i meta podatke za mapiranje u vidu anotacija [2].

Iznad svake domenske klase se postavlja anotacija @Entity, što znači da svaka domenska klasa predstavlja jedan entitet (objekat) u sistemu. Sljedeća anotacija koja se postavlja iznad klase je @Table(appliesTo = “naziv tabele”). Njome se povezuje entitet sa odgovarajućom tabelom u bazi. Sljede neke od anotacija za atribute domenske klase:

@Id – Identifikator identiteta

@Generated Value – Određuje strategiju za generisanje identifikatora. Neke od strategija su: AUTO, TABLE, IDENTITY, SEQUENCE, itd

@Column(name = “ID”) – Anotacija za kolonu

Anotacija se može staviti na atribut ili na geter atributa.

Ostaju još promene u hibernate.cfg.xml fajlu.

Page 4: Objektno-relaciono mapiranje podataka sa Hibernate …infoteh.etf.unssa.rs.ba/zbornik/2012/radovi/STS/STS-33.pdf · INFOTEH-JAHORINA Vol. 11, March 2012. - 1192 - Objektno-relaciono

- 1195 -

Session session = factory.openSession(); try { session.beginTransaction(); // Kod gde se manipuliše sa Session objektom session.getTransaction().commit(); } catch (HibernateException e) { Transaction tx = session.getTransaction(); if (tx.isActive()) tx.rollback(); } finally { session.close(); }

Možete primetiti da umesto putanje do XML fajlova za mapiranje, postavlja se putanja do klase koja u sebi ima elemente mapiranja (anotacije).

VI. SESSION OBJEKAT Session objekat predstavlja centralnu tačku u pristupu

Hibernate funkcionalnostima. Session objekat služi da kreira nove objekte u bazi, ažurira, postojeće objekte u bazi, da briše objekat iz baze i da čita objekte iz baze [1], [2].

Posmatrajući JDBC pristup, Session objekat može da se posmatra kao JDBC konekcija, a SessionFactory koji kreira Session objekte, može da se posmatra kao ConnectionPool koji stvara Connection objekte u JDBC-u.

SessionFactory je veoma skup objekat, njegovo dupliranje (ili instanciranje više puta) može da prouzrokuje probleme veoma brzo, a kreiranje ovog objekta oduzima dosta vremena u toku izvršavanja(runtime). Idealno bi bilo kada bi za jednu bazu podataka bio napravljen samo jedan SessionFactory objekat. Takođe pošto je SessionFactory thread-safe, to je još jedan razlog da se objekat instancira samo jednom i da sve niti u aplikaciji koriste taj objekat. Session objekti u Hibernate nisu thread safe. Preporučuje se da se kreira više Session objekata, za svaku programsku nit po jedan. Djeljenje Session objekata između više programskih niti može da prouzrokuje gubitak podataka ili deadlock. Ukoliko Hibernate Session objekat baci izuzetak bilo koje vrste, potrebno ga je uništiti i napraviti novi objekat. Ova prevencija štiti podatke u Session keš memoriji da ne postanu nekonzistentni u odnosu na podatke iz baze.

VII. TRANSAKCIJE I ZAKLJUČAVANJE Transakcija i zaključavanje objekata u bazi su dvije

operacije koje su usko povezane. Tehnike zaključavanja omogućuju uspešnost transakcije. U zavisnosti od toga kakva je transakcija zavisi i koji će se podaci zaključati. Koristeći Hibernate okvir programer nije u obavezi da koristi Transaction interfejs, ali zato bi morao da koristi flush() metod nad Session objektom, svaki put kada su izvršene promjene u bazi.

Transakcija predstavlja jedno izvršenje neke “logičke jedinice posla” korisnika baze podataka. Transakcija može biti startovana, trajno zapamćena u bazi podataka (commit) ili poništena (rollback). Da bi ovo postigli moramo prvo započeti transakciju session.beginTransaction() i tek onda manipulisati transakcijom. Dat je primjer koda.

Teorijiski transakcija mora da ima sledeće osobine (ACID osobine):

Autonomnost (Automicity) - Transakcija je sve ili ništa. Ukoliko se ne izvrše sve aktivnosti i operacije nad bazom, transakcija se poništava. Poništavaju se sve operacije(naredbe) koje su se izvršile (deo transakcije koji se izvršio – rollback). Tako se brzo vraća u prethodno stanje.

Konzistentnost (Consistency) – Transakcija ne sme da poništi pravila koja su definisana u bazi podataka. Ako iz nekog razloga transakcija poništi pravila baze podataka, onda se ona poništava.

Izolacija (Isolation) – Efekti transakcije ne mogu biti vidljivi drugim transakcijama dok se ona ne izvrši uspešno. Međutim, da bi se povećao paralelizam obrade transakcija, jednom SUBP se dozvoljavaju različiti nivoi izolativnosti podataka.

Trajnost (Durability) – Kada su neke promene potvrđene u bazi one se ne mogu više izgubiti.

Međutim ukoliko su ove osobine u potpunosti ispunjene, to može uticati na smanjenje performansi aplikacije. Zato proizvođači baza podataka, dozvoljavaju kršenje ovih osobina u većoj ili manjoj mjeri [3].

Postoje sljedeći nivoi izolacije:

• Nema izolacije – Sve je dozvoljeno. Baza podataka ili drajver ne podržava transakcije.

• Read Uncommited – Prljavo, neponovljivo i fantomsko čitanje je dozvoljeno.

• Read Commited – Neponovljivo i fantomsko čitanje je dozvoljeno.

• Repetable Read – Fantomsko čitanje je dozvoljeno

• Serializable – Pravila se moraju ispoštovati u potpunosti.

Baza podataka može da obezbedi različite nivoe izolacije. Na programeru je da proceni koji će nivo izolacije koristiti i kako će to uticati na performanse aplikacije. Da bi se sprječili simultani pristupi podacima, baza sama zaključava podatke. Zaključavanje može biti momentalno, dok se naredba izvršava nad podacima ili zaključavanje može trajati do završetka transakcije. Prva vrsta zaključavanja se zove optimistično, a druga pesimistično zaključavanje.

VIII. KEŠIRANJE Pristup bazi podataka je skupa operacija čak i za

jednostavan upit. Zahtev često mora biti poslat preko mreže do servera. Baza podataka mora da kompajlira SQL upitni jeziku jezik razumljiv bazi podataka. Ukoliko je u pitanju select upit podaci se opet trebaju vratiti do klijentskog sloja. Još ako podaci trebaju proći preko mreže, to znatno usporava rad aplikacije.

Većina baza podataka kešira (čuva podatke u memoriji) rezultate upita ako se izvršavaju više puta. Tako se smanjuje vrijeme komunikacije sa diskom (gdje su podaci) i kompajliranja upita. Međutim, to nije velika ušteda vremena,

Page 5: Objektno-relaciono mapiranje podataka sa Hibernate …infoteh.etf.unssa.rs.ba/zbornik/2012/radovi/STS/STS-33.pdf · INFOTEH-JAHORINA Vol. 11, March 2012. - 1192 - Objektno-relaciono

- 1196 -

ako imamo u vidu da imamo više klijenata koji prave različite zahtjeve.

JDBC ne obezbjeđuje keširanje direktno. Hibernate obezbjeđuje prvi nivo keširanja( L1 keš) kroz koji prolaze svi zahtjevi, drugi nivo keširanja je opcioni i može da se konfiguriše. L1 keš za isti zahtjev vraća response iz keša ( objekte koji su u kešu, a odnose se na taj zahtjev), ne ide se do baze. Da bi se izbrisali objekti iz keša, koji se odnose na jedan request objekat koristi se evict() metod. Da bi se u potpunosti ispraznio keš koristi se clear() metod. L1 keš je definitivno prednost Hibernate okvira u odnosu na JDBC.

Na slici možemo vidjeti dva keša koji su dostupni Session objektu. Obavezan L1 keš kroz koji zahtjevi moraju proći i opcioni L2 keš. L1 keš će uvijek biti kontaktiran pe nego što se kontaktira keš L2.

Slika 1. Veza između Session objekta i dva keša

L2 se nalazi eksterno van Hibernate okvira. Tako ga može koristiti više aplikacija ili više distribuiranih aplikacija. Koliko je opcioni keš potraban, i koji treba izabrati, najbolje je otkriti testiranjem aplikacije, a još bolje ponašanjem aplikacije u produkciji.

IX. HIBERNATE UPITNI JEZIK Hibernate Query Language ( u daljem tekstu HQL) je

objektno orijentisan upitni jezik. Sličan je SQL-u, ali pored operacije nad tabelama i kolonama, HQL radi sa perzistentnim objektima i njihovim atributima. HQL-om se mogu dobijati podaci iz baze (select naredba ) ili se mogu ažurirati podaci u bazi (inset, update, delete ). HQL-om se ne može promjeniti struktura baze (alter table, alter column, itd). HQL je jezik sa svojom sintaksom i gramatikom. HQL upiti se prevode u SQL upite, a Hibernate okvir ima mogućnost da direktno koristi SQL upite.

HQL se preporučuje kada je god to moguće kako bi se izbjegli problemi sa portabilnošću SQL-a sa bazom podataka. HQL je mnogo kompaktniji jezik od SQL jer koristi informacije definisane u Hibernate mapiranju.

HQL sintaksa je definisana ANTLR [2] gramatikom. Fajlovi za gramatiku se nalaze u folderu za gramatiku u Hibernate Core. ANTLR je alat za pravljenje parsera za jezike.

X. HIBERNATE VALIDACIJA Validacija podataka je obavezna za svaku aplikaciju. Bitna

je kako prezentacioni sloj tako i za perzistentni sloj. Često je ista logika za validaciju implementirana na svim slojevima, tako se smanjuje broj grešaka i manje je vrijeme za implementaciju. Da bi izbjegli dupliranje validacija na svakom sloju, programeri često celu validacionu logiku ubace u domenski model. Tako domenske klase predstavljaju klase sa meta podacima za validaciju podataka.

Slika 2. Validacija po slojevima [HibernateValidation]

JSR-303(Java Specification Request) – predstavlja validaciju objekta (bean validation). Definiše model meta podataka i API za validaciju objekta. Anotacije su podrazumevani izvor meta podataka. Anotacije imaju mogućnost da preklope i naslede meta podatke kroz korišćenje XML-a. API nije vezan za specifičan sloj aplikacije. Podjednako je dostupan i za serversku i za klijentsku stranu aplikacije. Hibernate validator je implementacija JSR-303.

Slika 3. Validacija u domenskom modelu [HibernateValidation]

XI. DEFINISANJE OGRANIČENJA Objekat u Java aplikaciji je validan, ako je u skladu sa svim

ograničenjima koja se odnose na taj objekat. Ograničenja u validaciji objekta se opisuju kroz java anotacije. U ovom dijelu ćemo objasniti kako se koristi Hibernate validator tj. kako on validira ograničenja opisana u anotacijama u domenskom modelu. Razlikujemo tri vrste ograničenja: nivo metode i nivo klase. Moramo znati da ne mogu sva ograničenja da se postave za svaki nivo.

Kada se koriste ograničenja na nivou polja, pristupa se vrednosti tog polja i proverava se da li je ona u skladu sa ograničenjem. Tip pristupa može bit private, protected ili public. Static polja i metode ne mogu biti validirane. Validacija se postavlja tako što se postavi anotacija iznad polja.

Page 6: Objektno-relaciono mapiranje podataka sa Hibernate …infoteh.etf.unssa.rs.ba/zbornik/2012/radovi/STS/STS-33.pdf · INFOTEH-JAHORINA Vol. 11, March 2012. - 1192 - Objektno-relaciono

- 1197 -

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator();

Umesto polja može se anotirati njen getter, ne može se koristiti setter. Preporuka je koji god se metod koristi (polja ili metode) da se koristi jedan ili drugi jer ako budemo imali dvije anotacije, validacija će se bespotrebno vršiti dvaput.

Ograničenje može biti postavljeno i na nivo klase. Kada se ograničenje postavi na nivo klase onda se svaki objekat te klase validira u skladu sa ograničenjima klase.

XII. NASLEĐIVANJE OGRANIČENJA Kada se validira objekat koji implentira interfejs ili

nasleđuje klasu, validiraju se ne samo njegova ograničenja, već i ograničenja koja implementira njegov interfejs ili ograničenja roditeljske klase.

XIII. VALIDACIJA OGRANIČENJA OBJEKTA Validator interfejs je glavna ulazna tačka za validaciju

objekta. Validator objekat se dobija od ValidatorFactory objekta. ValidationFactory se dobija preko statičke metode Validation.buildDefaultValidationFactory(). Sledi primer koda

Validator interfejs ima tri metode koje mogu da se koriste bilo za validaciju cjelog objekta ili za validaciju jednog atributa u objektu. Sve tri metode vraćaju Set<ConstraintViolation>.

Set je prazan ukoliko je validacija uspjela. U suprotnom za svako prekršeno ograničenje je dodat ConstraintViolation objekat. Metoda validate() proverava sva ograničenja prosleđenog objekta.

ZAHVALNICA Istraživanja u ovom radu rađena su u sklopu projektnog

rada iz predmeta “Nove softverske tehnologije “ na prvom ciklusu studija na fakultetu za informacione tehnologije, Slobomir P Univerziteta, pod mentorstvom prof. dr. Siniše Vlajića.

LITERATURA [1] Christian Bauer, Gaving King: Java Persistence with Hibernate, 2007. [2] Ilija Antović: Objektno-relaciono mapiranje i primjena korišćenjem

Hibernate okvira, 2009 . [3] Dave Minter, Jeff Linwood: Begining Hibernate, Apress, 2006.

ABSTRACT This document will be presented to the Hibernate framework, its basic functionality of Hibernate Core and components thet can be used with the Hibernate Core. Hibernate framework has a rich API, provides many opportunities. Oriented to the programmer, so what about the many does not have to think, it gets the Hibernate framework rather than programmers, so he leaves time to deal with the problems of business applications. The technology is very sophisticated and easy to operate . It reduces coding time and number of lines of code.

PAPER TITLEOBJECT-RELATIONAL MAPPING DATA WITH THE HIBERNATE FRAMEWORK

Gojić Branislav Mile Živković Maja Živković